首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Python eventlet中停止协程/线程

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

Stack Overflow用户
提问于 2011-05-26 12:20:54
回答 1查看 1.7K关注 0票数 1

当我使用eventlet包运行一个多协程任务时,即使协程池是空的,程序也不会继续运行,而是会陷入循环。下面是我的代码,最后一行永远不会执行。

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-22 20:26:58

最后一行永远不会被执行,因为对q.get()的最后调用永远阻塞,等待向队列中添加某些内容。有几种方法可以解决这个问题,包括传递一个超时值来获取。我认为最干净的解决方案是等待当前任务完成,如果队列为空,则在再次尝试循环的另一次迭代之前:

代码语言:javascript
运行
复制
while not q.empty():
    pool.spawn_n(download, q.get())
    if q.empty(): pool.waitall()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6133633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档