假设任务是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引发就会引发异常).