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

假设任务是Greenlet对象的列表.现在有什么区别

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本质上是一个等待的直通.

如果你确实传递了raise_error = True,那么joinall将通过你的greenlets,并在你的一个引发一个引发异常时引发异常(注意它使用iwait而不是wait,所以只要一个greenlet引发就会引发异常).

上一篇:python – 使用’yield’进行上下文切换


下一篇:使用gevent实现高并发并限制最大并发数