我有这样的功能
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()
行。
有人能告诉我什么错了吗?
答案 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()