2013-01-18 20 views
7

Die Sellerie Dokumentation sagt mir, wenn mehrere Aufgaben miteinander verkettet sind, wird das Ergebnis der ersten Aufgabe das erste Argument der nächsten sein. Mein Problem ist, ich kann es nicht zum Laufen bringen, wenn ich eine Aufgabe habe, die mehrere Ergebnisse liefert.Sellerie: Verketten Aufgaben mit mehreren Argumenten

. Beispiel:

@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 

Nun, wenn ich nenne sie in einer Kette wie (get_comments (url) | render_template()) apply_asnc() Python wird eine TypeError: render_template() takes exactly 2 arguments (0 given) werfen.

Ich kann sehen, dass die Ergebnisse nicht ausgepackt und auf die Argumente angewendet werden. Wenn ich get_comments nur aufrufen, kann ich tun:

result = get_comments(url) 
arg1, arg2 = result 

und beide Ergebnisse erhalten.

+0

Benutzer, die an einer Lösung für die Frage "Rückmeldung Positionsargumente für die nächste Funktion" interessiert sind, könnten an meiner Antwort http://stackoverflow.com/a/15778196/114917 –

Antwort

20

Hier sind zwei Fehler.

Zuerst müssen Sie nicht get_comments() und render_template() anrufen. Stattdessen sollten Sie die Task-Methode .s() verwenden. Wie:

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

In Ihrem Fall Sie starten die Funktion zuerst, und dann versucht, Funktionen Ergebnisse zu einer Kette zu verbinden.

Zweitens, tatsächlich, geben Sie nicht "zwei Ergebnisse" von Ihrer ersten Aufgabe. Stattdessen geben Sie ein Tupel zurück, das beide Ergebnisse enthält, und dieses Tupel wird als einzelnes Objekt an die zweite Task übergeben.

Daher sollten Sie Ihre zweite Aufgabe umschreiben als

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

Wenn Sie diese zu beheben, sollte es funktionieren.

+0

yup interessiert sein. – ashim888

+0

Ist das die einzige Möglichkeit? Kann man es mit Star-Argumentieren umsetzen? – FavorMylikes

Verwandte Themen