2013-01-18 12 views
7

Dokumentacja selera mówi mi, że jeśli wiele zadań jest połączonych ze sobą, wynik pierwszego zadania będzie pierwszym argumentem następnego. Mój problem polega na tym, że nie mogę uruchomić go, gdy mam zadanie, które zwraca wiele wyników.Selery: łańcuchowanie zadań z wieloma argumentami

. Przykład:

@task() 
def get_comments(url): 
    #get the comments and the submission and return them as 2 objects 
    return comments, submission 

@task 
def render_template(threadComments, submission): 
    #render the objects into a html file 
    #does not return anything 

Teraz, jeśli ja nazywam je w łańcuchu podobnych (get_comments (URL) | renderowanie_szablonu()) apply_asnc() Python rzuci TypeError: render_template() takes exactly 2 arguments (0 given).

Widzę, że wyniki nie są rozpakowywane i stosowane do argumentów. Jeśli zadzwonię tylko do get_comments, mogę zrobić:

result = get_comments(url) 
arg1, arg2 = result 

i otrzymam oba wyniki.

+0

Użytkownicy zainteresowani rozwiązaniem problemu "zwracania argumentów pozycyjnych dla następnej funkcji" mogą być zainteresowani moją odpowiedzią http://stackoverflow.com/a/15778196/114917 –

Odpowiedz

20

Tutaj są dwa błędy.

Po pierwsze, nie trzeba dzwonić pod numer get_comments() i render_template(). Zamiast tego należy użyć metody zadania .s(). Na przykład:

(get_comments.s(url) | render_template.s()).apply_async() 

W twoim przypadku najpierw uruchamiasz tę funkcję, a następnie próbuje połączyć wyniki funkcji z łańcuchem.

Po drugie, w rzeczywistości nie zwraca się "dwóch wyników" z pierwszego zadania. Zamiast tego zwracasz krotkę zawierającą oba wyniki, a ta krotka jest przekazywana do drugiego zadania jako pojedynczy obiekt.

Dlatego należy przepisać swoje drugie zadanie jako

@task 
def render_template(comments_and_submission): 
    comments, submission = comments_and_submission 

Jeśli naprawić nich, to powinno działać.

+0

tak samo jak ta poprawiona kopalnia. – ashim888

+0

Czy to jedyny sposób? Czy istnieje możliwość wdrożenia go z gwiazdą? – FavorMylikes

Powiązane problemy