我有一些依赖 I/O 重阻塞调用的生产者函数和一些也依赖 I/O 重阻塞调用的消费者函数。为了加快速度,我使用了 Gevent 微线程库作为粘合剂。
这是我的范例:
import gevent
from gevent.queue import *
import time
import random
q = JoinableQueue()
workers = []
producers = []
def do_work(wid, value):
gevent.sleep(random.randint(0,2))
print 'Task', value, 'done', wid
def worker(wid):
while True:
item = q.get()
try:
print "Got item %s" % item
do_work(wid, item)
finally:
print "No more items"
q.task_done()
def producer():
while True:
item = random.randint(1, 11)
if item == 10:
print "Signal Received"
return
else:
print "Added item %s" % item
q.put(item)
for i in range(4):
workers.append(gevent.spawn(worker, random.randint(1, 100000)))
#This doesnt work.
for j in range(2):
producers.append(gevent.spawn(producer))
#Uncommenting this makes this script work.
#producer()
q.join()
我有四个消费者,希望有两个生产者。生产者在发出信号时退出,即 10。消费者继续从这个队列中获取食物,当生产者和消费者结束时,整个任务完成。
但是,这不起作用。如果我注释掉for
产生多个生产者的循环并仅使用一个生产者,则脚本运行良好。
我似乎无法弄清楚我做错了什么。
有任何想法吗?
谢谢