刚开始接触gevent,特喜欢其中Coroutine的轻便。
前两天一直纠结于如何进行任务追加,目前摸索的情况是gevent似乎并不支持coroutine的追加,因为一直限制在这种想法中,迟迟无法迈步。看到有同事玩多线程,才恍然,所谓任务,无非就是对拥有特定格式的数据进行解析、执行,既然无法追加coroutine,那可以追加数据啊。下面的做法就几乎与多线程一致了。
做一组池,接入队列就齐活了。
哦,慢着!用队列接数据的话,不就会陷入阻塞了么,还有gevent的模式就是在coroutine陷入阻塞时将控制权限让回给调度器,用池的方式接队列,这个似乎有点...
gevent早就有了大杀器:JoinableQueue
这是官方doc中提供的代码(杯具啊,翻了N遍文档,就是没看queue这块..)
那么gevent提供的JoinableQueue与普通队列有啥区别捏,嘿嘿,还米有研究。暂时先这么滴吧,达成目的先。
标准的 池接队列 。
啥也不说了,打完收工。
欲知大杀器究竟如何,待俺研究透了再作分解~
前两天一直纠结于如何进行任务追加,目前摸索的情况是gevent似乎并不支持coroutine的追加,因为一直限制在这种想法中,迟迟无法迈步。看到有同事玩多线程,才恍然,所谓任务,无非就是对拥有特定格式的数据进行解析、执行,既然无法追加coroutine,那可以追加数据啊。下面的做法就几乎与多线程一致了。
做一组池,接入队列就齐活了。
哦,慢着!用队列接数据的话,不就会陷入阻塞了么,还有gevent的模式就是在coroutine陷入阻塞时将控制权限让回给调度器,用池的方式接队列,这个似乎有点...
gevent早就有了大杀器:JoinableQueue
def worker():
while True:
item = q.get()
try:
do_work(item)
finally:
q.task_done()
q = JoinableQueue()
for i in range(num_worker_threads):
gevent.spawn(worker)
for item in source():
q.put(item)
q.join() # block until all tasks are done
这是官方doc中提供的代码(杯具啊,翻了N遍文档,就是没看queue这块..)
那么gevent提供的JoinableQueue与普通队列有啥区别捏,嘿嘿,还米有研究。暂时先这么滴吧,达成目的先。
标准的 池接队列 。
啥也不说了,打完收工。
欲知大杀器究竟如何,待俺研究透了再作分解~