我这边遇到一个问题,使用 gevent 的时候,报了 loopexit 的错误。
import random
from Queue import Empty
import gevent
from gevent.queue import *
import gevent.monkey
gevent.monkey.patch_all()
q = Queue()
workers = []
def do_work(wid, value):
gevent.sleep(random.randint(0,2))
print 'Task', value, 'done', wid
return
def worker(wid):
while True:
try:
item = q.get()
if item:
do_work(wid, item)
except StopIteration:
break
except Empty:
break
def producer():
for i in range(4):
workers.append(gevent.spawn(worker, random.randint(1, 888888)))
for item in range(1, 9):
q.put(item)
producer()
gevent.joinall(workers)
我查了网上的资料,看了 gevent 的原理,但是没怎么看明白。网上主流的解释是任务流已经消费完了,协程都在做 waiter 的操作,导致 gevent 的 joinall 失败了。我没有理解这个过程。现在的我的解决办法是,消费完任务之后协程会报空的错误,捕捉一下就退出协程。但是我感觉这样只是掩盖了问题,没有解决问题。
item = q.get() >>item = q.get(block=False)
各位大佬怎么理解 loopexit ?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.