Python 为什么';t eventlet GreenPool在生成后调用func,除非waitall()?

Python 为什么';t eventlet GreenPool在生成后调用func,除非waitall()?,python,eventlet,green-threads,Python,Eventlet,Green Threads,此代码不打印任何内容: 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.GreenPo

此代码不打印任何内容:

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()
不是必需的

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


参考:

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

当代码运行时:

while True:
    pass
…该执行线程被阻塞–卡在该代码上–并且无法调度其他绿色线程

当您改为跑步时:

pool.waitall()
…eventlet确保它在等待时让步

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

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