2013-01-18 15 views
7

La documentazione di sedici indica che se più attività sono concatenate, il risultato della prima attività sarà il primo argomento del successivo. Il mio problema è che non riesco a farlo funzionare quando ho un'attività che restituisce più risultati.Celery: concatenamento di attività con più argomenti

Esempio:.

@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 

Ora, se io li chiamo in una catena come (get_comments (URL) | render_template()) apply_asnc() Python getterà un TypeError: render_template() takes exactly 2 arguments (0 given).

Vedo che i risultati non vengono scartati e applicati agli argomenti. Se chiamo solo get_comments, posso fare:

result = get_comments(url) 
arg1, arg2 = result 

e ottenere entrambi i risultati.

+0

Gli utenti interessati a una soluzione alla domanda "restituire gli argomenti posizionali per la prossima funzione" potrebbero essere interessati alla mia risposta http://stackoverflow.com/a/15778196/114917 –

risposta

20

Qui ci sono due errori.

In primo luogo, non è necessario chiamare get_comments() e render_template(). Invece, è necessario utilizzare il metodo di attività .s(). Ad esempio:

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

Nel tuo caso, si avvia prima la funzione, quindi si tenta di unire i risultati delle funzioni a una catena.

In secondo luogo, in realtà, non si restituiscono "due risultati" dal primo compito. Invece, si restituisce una tupla, contenente entrambi i risultati, e questa tupla viene passata alla seconda attività come singolo oggetto.

Pertanto, è necessario riscrivere il secondo compito come

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

Se si fissa questi, dovrebbe funzionare.

+0

sì, anche questa miniera fissa. – ashim888

+0

È questo l'unico modo per farlo? Esiste la possibilità di implementarlo con argomentazioni a stelle? – FavorMylikes

Problemi correlati