假设tasks是一个Greenlet对象列表.现在有什么区别
gevent.wait(tasks)
Run Code Online (Sandbox Code Playgroud)
和
gevent.joinall(tasks)
Run Code Online (Sandbox Code Playgroud)
?
不多!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引发就会引发异常).
| 归档时间: |
|
| 查看次数: |
1009 次 |
| 最近记录: |