У меня есть несколько функций производителей, которые полагаются на тяжелые блокирующие вызовы ввода-вывода, и несколько потребительских функций, которые тоже полагаются на тяжелые блокирующие вызовы ввода-вывода. Для того, чтобы ускорить их, я использовал микропоточную библиотеку 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
, который порождает несколько производителей, и использую только одного производителя, сценарий работает нормально.
Я не могу понять, что я сделал не так.
Есть идеи?
Спасибо