Скажем, tasks
- это список Greenlet
объектов. Теперь в чем разница междуВ чем разница между gevent.wait и gevent.joinall?
gevent.wait(tasks)
и
gevent.joinall(tasks)
?
Скажем, tasks
- это список Greenlet
объектов. Теперь в чем разница междуВ чем разница между gevent.wait и gevent.joinall?
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 повышений).