gevent.wait 和 gevent.joinall 有什么区别?
What's the difference between gevent.wait and gevent.joinall?
假设 tasks
是 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
本质上是对 wait
的传递。
如果您确实通过了 raise_error=True
,那么 joinall
将通过您的 greenlets,如果其中之一引发异常,则引发异常(请注意,它使用 iwait
而不是 wait
, 因此一旦一个 greenlet 出现就会引发异常。
假设 tasks
是 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
本质上是对 wait
的传递。
如果您确实通过了 raise_error=True
,那么 joinall
将通过您的 greenlets,如果其中之一引发异常,则引发异常(请注意,它使用 iwait
而不是 wait
, 因此一旦一个 greenlet 出现就会引发异常。