1

我有这样的功能

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()排队等候。

有人可以告诉我有什么问题吗?

4

1 回答 1

1

但它永远在 pool.join() 线上等待。
有人可以告诉我有什么问题吗?

没有什么!

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

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

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

基本上,.join()不是永远等待,而是等到你的线程结束。如果您的线程之一永无止境,那么join()将永远阻塞。因此,请确保每个 greenlet 线程都终止,并join()在所有作业完成后重新执行。


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

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

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

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

for row in res:
    pool.spawn(fetch, row[0], row[1])
pool.close()
pool.join()
于 2014-05-19T13:58:46.893 回答