gpt4 book ai didi

Python gevent pool.join() 永远等待

转载 作者:太空宇宙 更新时间:2023-11-03 18:23:07 24 4
gpt4 key购买 nike

我有一个这样的功能

def check_urls(res):
pool = Pool(10)
print pool.free_count()
for row in res:
pool.spawn(fetch, row[0], row[1])
pool.join()

pool.free_count() 输出值 10。

我使用pdb来跟踪。程序工作正常,直到 pool.spawn() 循环。

但它永远在 pool.join() 行等待。

谁能告诉我出了什么问题吗?

最佳答案

But its waiting forever at pool.join() line.
Can someone tell me whats wrong?

没什么!

尽管我首先写了下面的内容,但 gevent 中的 join() 函数的行为方式仍然与子进程/线程中的行为方式几乎相同。它会一直阻塞,直到所有 greenlet 都完成为止。

如果您只想测试池中的所有 greenlet 是否都已结束,您可能需要检查 ready()在泳池的每个小绿地上:

is_over = all(gl.ready() for gl in pool.greenlets)

基本上,.join() 不会永远等待,而是等待线程结束。如果其中一个线程永远不会结束,那么 join() 将永远阻塞。因此,请确保每个 greenlet 线程都终止,并且在所有作业完成后 join() 将返回执行。

<小时/>

编辑:以下内容仅适用于子进程或线程模块标准 API。 GEvent 的 greenlet 池与“标准”API 不匹配。

join()线程/进程上的方法的目的是使主进程/线程永远等待,直到子进程/线程结束。

您可以使用timeout参数让它在一段时间后恢复执行,或者您可以使用is_alive()方法来检查它是否正在运行无阻塞。

在进程/线程池的上下文中,join()还需要在调用 close()terminate() 之后触发,因此您可能需要至:

for row in res:
pool.spawn(fetch, row[0], row[1])
pool.close()
pool.join()

关于Python gevent pool.join() 永远等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23739574/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com