为什么事件 GreenPool 在 spawn_n 之后不调用 func,除非 waitall()?



此代码不打印任何内容:

def foo(i):
    print i
def main():
    pool = eventlet.GreenPool(size=100)
    for i in xrange(100):
        pool.spawn_n(foo, i)
    while True:
        pass

但这个代码打印数字:

def foo(i):
    print i
def main():
    pool = eventlet.GreenPool(size=100)
    for i in xrange(100):
        pool.spawn_n(foo, i)
    pool.waitall()
    while True:
        pass

唯一的区别是pool.waitall()。在我看来,waitall()意味着等待池中的所有绿线程完成工作,但无限循环等待每个绿线程,因此pool.waitall()不是必需的。

那么为什么会发生这种情况呢?

参考:http://eventlet.net/doc/modules/greenpool.html#eventlet.greenpool.GreenPool.waitall

在eventlet GreenPool中创建的线程是绿色线程。这意味着它们都存在于操作系统级别的一个线程中,并且Python解释器处理它们之间的切换。只有当一个线程产生(故意为其他线程提供运行机会)或正在等待I/O时,才会发生这种切换。

当你的代码运行时:

while True:
    pass

…该执行线程被阻塞——卡在该代码上——并且没有其他绿色线程可以被调度。

当你转而运行:

pool.waitall()

…eventlet确保它在等待时屈服。

您可以通过稍微修改while循环来调用eventlet.sleep函数来模拟这种相同的行为,这将产生:

while True:
    eventlet.sleep()

如果您想在等待池中的线程完成的同时在while True:循环中做其他事情,这可能会很有用。否则,只需使用pool.waitall()——这就是它的用途。

相关内容

  • 没有找到相关文章

最新更新