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