如何在Python eventlet中停止协程/线程

问题描述:

当我使用eventlet包运行多协程任务时,即使协程池为空,程序也不会继续运行,但会停滞在循环。以下是我的代码,最后一行永远不会执行。如何在Python 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 
+0

任何人有什么想法? – Baibai 2011-05-29 12:13:20

最后一行永远不会被执行,因为你最终调用q.get()块永远在等待着什么要添加到队列中。有几种方法可以解决此问题,包括传递超时值以获取。我认为最干净的解决方案是等待当前任务完成,如果队列是空的,然后再次尝试再次迭代循环:

while not q.empty(): 
    pool.spawn_n(download, q.get()) 
    if q.empty(): pool.waitall()