当前位置:  开发笔记 > 编程语言 > 正文

除非waitall(),否则为什么eventlet GreenPool在spawn_n之后不调用func?

如何解决《除非waitall(),否则为什么eventletGreenPool在spawn_n之后不调用func?》经验,为你挑选了1个好方法。

此代码不打印任何内容:

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



1> jbg..:

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

当您的代码运行时:

while True:
    pass

…该执行线程被阻止 –停留在该代码上–其他绿色线程无法调度。

当您改为运行时:

pool.waitall()

…eventlet确保它在等待时产生。

您可以通过while稍微修改循环以调用该eventlet.sleep函数来模仿此行为,从而产生:

while True:
    eventlet.sleep()

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

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有