3

此代码不打印任何内容:

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

4

1 回答 1

5

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

当您的代码运行时:

while True:
    pass

……那个执行线程被阻塞了——卡在那个代码上——并且没有其他绿色线程可以被调度。

当您改为运行时:

pool.waitall()

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

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

while True:
    eventlet.sleep()

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

于 2016-01-02T09:01:55.280 回答