此代码不打印任何内容:
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()
——这就是它的用途。