2012-12-18 10 views
5

że chcą użyć grupy (lub fragmentów) wewnątrz sieci, takich jak:selera - grupę w obrębie łańcucha

chain(getRange.s(3), GROUP() , xsum.s()) 

przypadku GROUP() jest grupą double() zadań, to znaczy group(double(0),double(1),double(2)). Podobne pytanie zostało opublikowane w How to chain a Celery task that returns a list into a group?, ale nie wyjaśniono, jak przekazać dane wyjściowe z grupy do następnego zadania w łańcuchu.

@task 
def getRange(x): 
    return range(x) 

@task 
def double(nr): 
    return nr*2 

@task 
def xsum(list): 
    return sum(list) 

Odpowiedz

5

Nie sądzę, że istnieje sposób, aby to zrobić z obecnymi prymitywami w jednym łańcuchu. Przesyłanie wywołań zwrotnych, takich jak w pytaniu, o którym wspomniałeś, nie pozwoli ci słuchać, kiedy zadania grupowe się zakończyły. Najbliżej można dostać coś takiego jak:

@task 
def get_range(x): 
    return range(x) 

@task 
def mapper(nr): 
    return nr * 2 

@task 
def reducer(nrs): 
    return sum(nrs) 

@task 
def double_then_sum(nrs): 
    return (
    group([mapper.s(nr) for nr in nrs]) | 
    reducer.s() 
)() 

ar = (get_range.s(3) | double_then_sum.s())() # call the procedure 
ar.result.result # get the result 

przeciwnym razie można spróbować użyć dynamic chaining, co doprowadziłoby do prostsze rozwiązanie, lub po prostu użyć map jeśli nie potrzebuję twoich pogrupowane zadania równolegle.