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

big*_*ind 4 python gevent

假设tasks是一个Greenlet对象列表.现在有什么区别

gevent.wait(tasks)
Run Code Online (Sandbox Code Playgroud)

gevent.joinall(tasks)
Run Code Online (Sandbox Code Playgroud)

Tho*_*zco 7

不多!joinall实际上是wait内部调用,并且是一个非常短的函数(源代码):

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
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,除非你通过raise_error=True,joinall本质上是一个直通到wait.

如果你确实通过了raise_error=True,那么joinall就通过你的greenlets,如果你们中的一个引发了一个例子,就会引发异常(请注意,它会使用iwait而不是wait,因此只要一个greenlet引发就会引发异常).