2014-09-13 8 views
5

ho questo compito Sedano:Come contrassegnare manualmente un'attività di Celery come eseguita e impostarne il risultato?

@app.task 
def do_something(with_this): 

    # instantiate a class from a third party library 
    instance = SomeClass() 

    # this class uses callbacks to send progress info about 
    # the status and progress of what we're doing 
    def progress_callback(data): 
     # this status will change to 'finished' later 
     # but the return value that I want as the task result won't be returned 
     # so this is where I should mark the task as done manually 
     if data['status'] == 'working': 
      # I create a custom state for this task 
      do_something.update_state(
       state = 'PROGRESS', 
       meta = data['progress'] 
      ) 

    # adding the callback to the instance 
    instance.add_callback(progress_callback) 

    # use the instance to do what I want 
    # this functions returns a value that I don't want as the task result 
    # so leaving this function without a return statement will make it None 
    instance.do_job(with_this) 

Come posso contrassegnare un'attività come fatto manualmente?

In questo caso la funzione raggiunge la fine, senza alcuna return dichiarazione in modo che il task.result quello che ottiene è None, voglio impostare i dati passati alla funzione di callback come il risultato e contrassegnare l'attività come fatto.

Ho provato ad utilizzare:

app.backend.mark_as_done(do_something.request.id, data) 

E 'l'impostazione con successo lo stato e il risultato del compito, ma poi il risultato è impostato il valore di ritorno della funzione che è qui None.

risposta

5

ho finalmente trovato la soluzione che si memorizza lo stato compito e risultato poi ignorando l'operazione sollevando un'eccezione Ignore, ad esempio:

from celery.exceptions import Ignore 

@app.task 
def do_something(with_this): 

    # store the state and result manually 
    # the SUCCESS state is set by this method 
    app.backend.mark_as_done(
     do_something.request.id, 
     the_data_to_store 
    ) 

    # we can also use update_state which calls 
    # backend.store_result just like mark_as_done 
    # but we have to set the state in this case 
    do_something.update_state(
     state = celery.states.SUCCESS, 
     meta = the_data_to_store 
    ) 

    # ignore the task so no other state is recorded 
    # like what was happening with my function in the question 
    # the task will still be acknowledged 
    raise Ignore() 

Questo è utile quando non è possibile restituire i dati che si desidera conservare come risultato.