Как я могу реализовать парадигму мультипроизводителя и мультипотребителя в Gevent?

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

Я не могу понять, что я сделал не так.

Есть идеи?

Спасибо

5
задан Mridang Agarwalla 8 December 2015 в 15:15
поделиться