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()
——这就是它的用途