我有一个这样的函数
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()