2010-10-10 17 views
30

sugeruje, że nie jest dobrym pomysłem, aby zadania czekały na wyniki innych zadań ... Ale sugerowane rozwiązanie (patrz "dobry" nagłówek) pozostawia coś do życzenia. W szczególności nie ma jasnego sposobu na uzyskanie wyniku podzadania z powrotem do osoby dzwoniącej (również jest to trochę brzydkie).Python + Seler: Chaining jobs?

Czy istnieje sposób "łączenia" zleceń, aby dzwoniący uzyskał wynik ostatniej pracy? Na przykład, aby użyć przykładu add:

>>> add3 = add.subtask(args=(3,)) 
>>> add.delay(1, 2, callback=add3).get() 
6 

Naprzemiennie jest to OK, aby powrócić do wystąpień wynik? Na przykład:

@task 
def add(x, y, callback=None): 
    result = x + y 
    if callback: 
     return subtask(callback).delay(result) 
    return result 

To pozwoli wynikiem „ostatecznego” pracy w sieci może być retrived z prostym:

result = add(1, 2, callback=add3).delay() 
while isinstance(result, Result): 
    result = result.get() 
print "result:", result 
+0

Co proponujecie będzie działać prawidłowo. Nie widzę żadnej alternatywy, prawda? – asksol

Odpowiedz

30

Można to zrobić za pomocą łańcucha selera. Zobacz https://celery.readthedocs.org/en/latest/userguide/canvas.html#chains

@task() 
def add(a, b): 
    time.sleep(5) # simulate long time processing 
    return a + b 

łańcuchowym pracy:

# import chain from celery import chain 
# the result of the first add job will be 
# the first argument of the second add job 
ret = chain(add.s(1, 2), add.s(3)).apply_async() 

# another way to express a chain using pipes 
ret2 = (add.s(1, 2) | add.s(3)).apply_async() 

... 

# check ret status to get result 
if ret.status == u'SUCCESS': 
    print "result:", ret.get() 
+0

Witam, próbuję uzyskać wynik połączonego procesu, takiego jak ta sugestia, ale otrzymam ostrzeżenie: '[2016-09-15 16: 20: 52,684: WARNING/Worker-7] /Library/Python/2.7/site- packages/celery/result.py: 45: RuntimeWarning: Nigdy nie wywołaj metody result.get() w ramach zadania! 'Zobacz http: // docs.celeryq.org/pl/latest/userguide/tasks.html # task-synchronous-subtask'' ' W Celery 3.2 spowoduje to podniesienie wyjątku o zamiast bycia tylko warning. Używam podzadania w łańcuchu jako 'result = chain (..., ..., ...). delay(). get()' czy możesz wyjaśnić, dlaczego powoduje on problem, mimo że podzadania są obsługiwane przez metoda łańcucha? – user305883