I have this Celery task:
@app.task
def do_something(with_this):# instantiate a class from a third party libraryinstance = SomeClass()# this class uses callbacks to send progress info about# the status and progress of what we're doingdef 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 manuallyif data['status'] == 'working':# I create a custom state for this taskdo_something.update_state(state = 'PROGRESS',meta = data['progress'])# adding the callback to the instanceinstance.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 Noneinstance.do_job(with_this)
How can I mark a task as done manually ?
In this case the function reaches the end without any return
statement so the task.result
I get is None
, I want to set the data passed to the callback function as the result and mark the task as done.
I tried using:
app.backend.mark_as_done(do_something.request.id, data)
It's successfully setting the state and the result of the task but later the result is set to the return value of the function which is here None
.