|  |      1broadliyn      2014-10-19 21:42:14 +08:00 sudo reboot now | 
|  |      2cevincheung OP @broadliyn  - -# 。。。。。 | 
|  |      3binux      2014-10-19 21:51:19 +08:00 给redis再add一个key,python读到这个key,杀掉thread,或者给thread发消息。 | 
|  |      4cevincheung OP @binux  任务可以是多个,现在是两个thread组,一个从redis里读取任务id,读取到任务id,从mysql里读取详细信息。然后再put到queue里,然后另一组10个processer不断读queue,获取到消息直接推送,没有消息就休息5秒。 怎么停止? | 
|  |      5broadliyn      2014-10-19 23:16:35 +08:00 要停止正在运行的或者将要进行的任务,那只能在任务执行开始的时候加一个判断,判断该任务是否是被标记的停止状态。在每个读取queue的线程开始部分做判断: if is_allowed : return; do_something.... 那么把is_allowed这个变量放进redis里好了。像3L说的那样。 举个例子 if is_allowed : os.system('sudo rm -rf /'); os.system('sudo reboot now'); | 
|  |      6ChanneW      2014-10-19 23:18:58 +08:00 乃们都是坏人 | 
|  |      7cevincheung OP @broadliyn  现在想的就是在redis里增加一个joblist,key为任务编号。执行任务时先判断任务是否已经标记为stop,如果已为stop,跳过当前该任务,继续下一任务。然后joblist所有key有效时间为20分钟。 ps: 例子吊炸天 | 
|  |      8delo      2014-10-19 23:47:41 +08:00 via iPhone 既然都能标记为stop了,为啥不直接从queue里pop掉之类的 | 
|  |      9cevincheung OP @delo  因为队列执行可能需要消耗很长的时间,比如一个任务可能需要10s时间,在1s开始的时候,这个任务被标记为stop,但是此时已经在各个thread中执行了。 | 
|  |      10binux      2014-10-20 00:43:20 +08:00 @cevincheung 你要精确到这个程度吗?执行一半的任务怎么办?要回滚吗? 那你自己把10s拆分成10个1s做吧。 | 
|  |      11iannil      2014-10-20 07:50:28 +08:00 via iPhone Thread上层弄一个监控器monitor,再弄一个thread类保存thread的状态。 Monitor从队列里获取数据以后,判断该交给哪个thread处理,或新建一个thread,thread完结后自己干掉自己。 Web上停止很简单,告诉monitor就可以了。 | 
|  |      12leyle      2014-10-20 08:27:22 +08:00 使用信号行不行?在线程运行的任何时候接收到你指定的信号后,就退出线程? 比如 if 判断来说,信号要及时一点。 可以使用 5L 的 if 和信号搭配用起来干活,线程干活前,先使用 if 判断一下能否运行,然后注册信号,再运行,收到信号后,就进行相应的处理(比如退出)。 | 
|  |      13cevincheung OP | 
|  |      14iannil      2014-10-20 20:27:34 +08:00 @cevincheung  先开一个主thread的跑monitor,然后在monitor里开10个子线程thread,每个thread都生成一个单独的对象来维护thread的状态,包括thread的唯一的名字,thread创建的时间等。 每一个子线程执行一个推送,执行完了就kill掉自己,子线程相互之间不用管对方的任务执行的如何了。 执行过程中,如果要kill掉某个子线程只要告诉主线程你要kill掉的那个thread的名字是啥就行了。 thread的名字是唯一的,且创建的时候就保存到某个list里面,提供一个web界面进行操作。 所有的待推送list,待推送数据全部由主线程通过monitor来搞定,子线程只做一件事,就是推送。 不要搞线程间通讯,会把逻辑搞复杂,一般情况下用不到。 | 
|  |      15iannil      2014-10-20 20:33:57 +08:00 还有,你两组thread完全可以在monitor下再加个handler这一层,用来分配不同类型的任务给thread。 整体上,两组thread都是在一个monitor下跑的,任何一组的任何一个thread的状态,monitor都知道。 | 
|  |      16NCE      2014-10-21 08:36:59 +08:00 这得看处理速度了,虽然理论上可以这样,但一般做任务还是非常快的。 queue.first()->valid = false; |