2015-10-07 3 views

ответ

5

Не так много! 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 повышений).