2014-09-13 70 views
5

我有这样的任务芹菜:如何手动将Celery任务标记为完成并设置其结果?

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

我怎么能任务标记为手动完成?

在这种情况下,函数到达最后而没有任何return语句,因此我得到的task.resultNone,我想设置传递给回调函数的数据作为结果并将任务标记为完成。

我试着使用:

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

它成功设置状态和任务的结果,但后来的结果被设定为是这里None函数的返回值。

回答

5

我终于发现这是存储任务状态和结果,然后通过引发Ignore例外忽略任务的解决方案,例如:

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

这是有用的,当你不能回到你想要的数据,作为结果存储。

相关问题