Python gevent pool.join()永远等待



我有一个这样的函数

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()线等待。

谁能告诉我怎么了?

但是它永远在pool.join()行等待。
谁能告诉我怎么了?

!

虽然,我首先写了行下面的内容,但gevent中的join()函数的行为仍然与子进程/线程中的行为几乎相同。在greenlet完成之前,它会阻塞。

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

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

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


edit:以下内容仅适用于子进程或线程模块的标准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()

相关内容

  • 没有找到相关文章

最新更新