Tôi đang cố gắng để thiết lập một hệ thống sản xuất-tiêu dùng đơn giản trong Gevent nhưng kịch bản của tôi không làm lối ra:đề Gevent không kết thúc mặc dù tất cả các mục Queue đang cạn kiệt
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)
tôi thiên đường' Tôi đã có thể tìm thấy các ví dụ/hướng dẫn tốt về cách sử dụng Gevent vì vậy những gì tôi đã dán ở trên là những gì tôi đã thu thập từ internet.
Nhiều công nhân được kích hoạt, các mục đi vào hàng đợi nhưng ngay cả khi mọi thứ trong hàng đợi kết thúc, chương trình chính không thoát. Tôi phải bấm CTRL^C
.
Tôi đang làm gì sai?
Cảm ơn.
Lưu ý phụ: nếu có bất kỳ điều gì mà tập lệnh của tôi có thể được cải thiện, vui lòng cho tôi biết. Những điều đơn giản như kiểm tra khi Hàng đợi trống, v.v.
Bạn có thể giải thích về những gì tôi đã làm sai không? Bạn giải pháp hoạt động tốt nhưng nó sẽ là tốt để biết. Cảm ơn. –
@ MridangAgarwalla, tôi không quá quen thuộc với greenlet internals để xây dựng, nhưng tôi nghĩ 'q.get()' với các tham số mặc định 'block = True, timeout = None' sẽ chặn mãi mãi trên hàng đợi rỗng. Ví dụ, tôi đang sử dụng gevent-1.0b1.win32, và nó tăng 'gevent.hub.LoopExit: Thao tác này sẽ chặn vĩnh viễn' ngoại lệ khi tôi cố gắng' queue.get() 'trên hàng đợi rỗng' trong này http://pastebin.com/mduShJBs – reclosedev