Próbuję skonfigurować prosty system producent-konsumentów Gevent ale mój skrypt nie exit:Gevent wątki nie dokończyć chociaż wszystkie elementy kolejki są wyczerpane
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)
I haven” Byliśmy w stanie znaleźć dobre przykłady/tutoriale na temat korzystania z Gevent, więc to, co wkleiłem powyżej, jest tym, co stworzyłem z Internetu.
Aktywuje się wielu pracowników, elementy są przenoszone do kolejki, ale nawet gdy kończy się wszystko w kolejce, program główny nie wychodzi. Muszę nacisnąć CTRL^C
.
Co robię źle?
Dzięki.
Na marginesie: jeśli jest coś, co można poprawić, proszę daj mi znać. Proste rzeczy, takie jak sprawdzanie, kiedy kolejka jest pusta, itp.
Czy mógłbyś wyjaśnić, co robiłem źle? Twoje rozwiązanie działa dobrze, ale dobrze by było wiedzieć. Dzięki. –
@MridangAgarwalla, Nie jestem zaznajomiony z wewnętrznymi wersjami greenletów, ale myślę, że 'q.get()' z domyślnymi parametrami 'block = True, timeout = None' będzie blokował na zawsze w pustej kolejce. Na przykład, używam gevent-1.0b1.win32, i to podnosi 'gevent.hub.LoopExit: Ta operacja będzie blokować na zawsze wyjątek, kiedy próbuję zrobić' queue.get() 'w pustej' kolejce' w tym kod http://pastebin.com/mduShJBs – reclosedev