我想成立GEVENT一個簡單的生產者 - 消費者系統,但我的腳本不退出:GEVENT線程沒有完成,即使所有隊列中的項目都用盡
import gevent
from gevent.queue import *
import time
import random
q = Queue()
workers = []
def do_work(wid, value):
"""
Actual blocking function
"""
gevent.sleep(random.randint(0,2))
print 'Task', value, 'done', wid
return
def worker(wid):
"""
Consumer
"""
while True:
item = q.get()
do_work(wid, item)
def producer():
"""
Producer
"""
for i in range(4):
workers.append(gevent.spawn(worker, random.randint(1, 100000)))
for item in range(1, 9):
q.put(item)
producer()
gevent.joinall(workers)
我的天堂」無法找到使用Gevent的好例子/教程,所以我上面粘貼的是我從互聯網上修補過的東西。
多個工人被激活,物品進入隊列,但即使隊列中的所有物品都完成,主程序也不會退出。我必須按CTRL^C
。
我在做什麼錯?
謝謝。
附註:如果有任何我的腳本可以改進,請告訴我。簡單的事情,如檢查隊列是空的時候等。
你能詳細說明我做錯了什麼嗎?你的解決方案工作正常,但它是很好的知道。謝謝。 – 2012-02-08 15:56:23
@MridangAgarwalla,我不太熟悉greenlet的內部細節,但我認爲'q.get()'默認參數'block = True,timeout = None'會在空隊列上永遠阻塞。例如,我使用的是gevent-1.0b1.win32,它引發了'gevent.hub.LoopExit:當我嘗試在這個空的'queue'上嘗試'queue.get()'時,這個操作會永遠阻止異常代碼http://pastebin.com/mduShJBs – reclosedev 2012-02-08 16:58:41