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

What's the difference between gevent.wait and gevent.joinall?

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

有什么区别
gevent.wait(tasks)

gevent.joinall(tasks)

?

不多! 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=True,否则 joinall 本质上是对 wait 的传递。

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