gevent.wait和gevent.joinall有什么区别?

时间:2015-10-07 18:17:20

标签: python gevent

假设tasksGreenlet个对象的列表。现在

之间的区别是什么
gevent.wait(tasks)

gevent.joinall(tasks)

1 个答案:

答案 0 :(得分:7)

不多! joinall实际上在内部调用wait,并且是一个很短的函数(source code):

def joinall(greenlets, timeout=None, raise_error=False, count=None):
    if not raise_error:
        return wait(greenlets, timeout=timeout, count=count)

    done = []
    for obj in iwait(greenlets, timeout=timeout, count=count):
        if getattr(obj, 'exception', None) is not None:
            if hasattr(obj, '_raise_exception'):
                obj._raise_exception()
            else:
                raise obj.exception
        done.append(obj)
    return done

如您所见,除非您通过raise_error=Truejoinall基本上是wait的直通。

如果您确实通过了raise_error=True,那么joinall将通过您的greenlets,如果其中一个提出一个,则会引发异常(请注意它使用的是iwait而不是{{1}因此,只要一个greenlet引发就会引发异常。