Estoy tratando de establecer un sistema productor-consumidor simple en GEvent pero mi guión no sale:hilos GEvent no terminan a pesar de que todos los elementos de la cola se agotan
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)
no he Pude encontrar buenos ejemplos/tutoriales sobre el uso de Gevent así que lo que he pegado arriba es lo que he improvisado de Internet.
Se activan varios trabajadores, los elementos van a la cola, pero incluso cuando todo en la cola finaliza, el programa principal no se cierra. Tengo que presionar CTRL^C
.
¿Qué estoy haciendo mal?
Gracias.
En una nota al margen: si hay algo que pueda mejorar mi script, por favor avíseme. Cosas simples como verificar cuando la cola está vacía, etc.
¿Podría explicar lo que estaba haciendo mal? Tu solución funciona bien, pero sería bueno saberlo. Gracias. –
@MridangAgarwalla, no estoy tan familiarizado con las funciones internas de greenlet para elaborar, pero creo que 'q.get()' con los parámetros por defecto 'block = True, timeout = None' bloqueará para siempre en la cola vacía. Por ejemplo, estoy usando gevent-1.0b1.win32, y plantea 'gevent.hub.LoopExit: esta operación bloquearía la excepción forever' cuando intento hacer' queue.get() 'en' cola 'vacía en este código http://pastebin.com/mduShJBs – reclosedev