How to manually mark a Celery task as completed and set its result?

I have a celery assignment:

@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) 

How can I mark a task as completed manually?

In this case, the function ends without a return , so task.result I get None , I want to set the data passed to the callback function as a result and mark the task as completed.

I tried using:

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

It successfully sets the state and result of the task, but later the result is set to the return value of the function, which is None here.

+5
source share
1 answer

Finally, I found a solution that saves the state of the task and the result, and then ignores the task, Ignore exception, for example:

 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() 

This is useful if you cannot return the data you want to save as a result.

+5
source

Source: https://habr.com/ru/post/1202508/


All Articles