问题描述
||
当我使用eventlet包运行多协程任务时,即使协程池为空,该程序也不会继续运行,但会陷入循环。以下是我的代码,最后一行永远不会执行。
import eventlet
global count
post_id=[]
last_id=0
def download(post_id):
global count
print \"coroutines :\",post_id
if count<last_id:
count=count+1
q.put(count) # put new coroutines in the queue
pool = eventlet.GreenPool()
q = eventlet.Queue()
for i in range(100,200):
post_id.append(i)
for i in range(0,5):
q.put(post_id[i]) # keep 6 coroutines in the pool
count=post_id[5]
last_id=200
while not q.empty() or pool.running()!=0:
pool.spawn_n(download,q.get()) #start corroutines
print \"The end\" #nerver reach to this line
解决方法
最后一行永远不会执行,因为对q.get()的最终调用将永远阻塞,等待将某些内容添加到队列中。有几种方法可以解决此问题,包括传递超时值来获取。我认为最干净的解决方案是,如果队列为空,则等待当前任务完成,然后再次尝试循环的另一次迭代:
while not q.empty():
pool.spawn_n(download,q.get())
if q.empty(): pool.waitall()