Python gevent pool.join()永远等待

时间:2014-05-19 13:50:13

标签: python multithreading gevent greenlets

我有这样的功能

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()行。

有人能告诉我什么错了吗?

1 个答案:

答案 0 :(得分:1)

  

但它永远在pool.join()行等待。
  有人能说我错了吗?

什么也没有!

虽然,我首先在线下面写了什么,gevent中的join()函数的行为与子进程/线程的行为几乎相同。它会阻塞,直到完成所有的greenlets。

如果您只想测试池中的所有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()方法检查它是否正在运行而不会阻塞。< / p>

在流程/线程池的上下文中,join()也需要在 调用close()或{之后 触发{1}},所以您可能想要:

terminate()