/ 详情

改用事件机制来驱动Worker的工作,避免使用任何的Thread.sleep操作

Done
owner
Opened this issue  
2016-01-15 23:13
  1. QueueManager的append方法内部需要额外加上产生事件通知的处理。产生一个事件Msg到事件队列上
  2. 在WorkerManager里,先使用take接收事件通知消息,若拿到消息,判断线程是否可用,若可用,使用take从任务队列获取任务,最后再来执行worker。若线程不可用,则返回上一步take等待下一次消息的到来。从而避免sleep.
  3. Worker完成工作后,若没有产生任何新的task,要产生一个消息Msg通知到事件队列上,告诉Manager线程空闲了,可以尝试去take任务,这里注意一定要用异步的消息产生逻辑,不能同步等待消息是否到达,否则当前worker线程就有可能被长期占用了。
    综上,其实就是在现有的队列基础上拷贝多一条消息队列。比如下载队列增加一个下载消息队列,解析队列增加一个解析消息队列,结果处理队列增加一个结果处理消息队列。然后Manager在现在的基础上加多一个从消息队列里take消息的操作,然后再来从任务队列里take任务,这样就不用sleep了。否则如果是take任务,如果拿到任务但是发现worker线程不可用,这时候就会造成任务无法处理,这时候如果把判断线程可用放到前面来执行,可以避免这个情况,但是因为这个判断不像take会阻塞到有任务,而是有可能得到线程不可用的结果,这时候就需要sleep一下,否则while循环会把CPU吃完的。

Comments (7)

而一旦加了sleep,这个时候就会降低最大处理能力了。

重新又思考了下,还有一个更简单的办法也能避免使用sleep,那就是让Worker变得更加主动,不能被动的依赖Manager去分配任务就行了。

开放的开发过程,
很好的代码注释,
简洁流畅的代码,
新颖特色的特征,
感觉这几点在开源项目中很少的,可惜现在了解这个项目的人太少了,不过一定会成功的!

@ChrysanthemumWang 兄弟,参与进来吧,一起努力,加QQ493781187,我拉你进群和讨论组,还有另外两位兄弟等着你呢

不胜荣幸 +1

已处理。
使用Worker主动获取任务的方式

Status changed to closed

Sign in to comment

状态
Assignees
Milestones
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
Branches
Planed to start   -   Planed to end
-
Top level
Priority
参与者(2)
117 l weiwei 1578913730