【问题标题】:How to manually mark a Celery task as done and set its result?如何手动将 Celery 任务标记为已完成并设置其结果?
【发布时间】:2014-11-07 17:11:07
【问题描述】:

我有这个芹菜任务:

@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

【问题讨论】:

    标签: python celery


    【解决方案1】:

    我终于找到了存储任务状态和结果然后通过引发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()
    

    当您无法将要存储的数据作为结果返回时,这很有帮助。

    【讨论】:

      猜你喜欢
      • 2014-07-19
      • 1970-01-01
      • 2019-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-03
      • 1970-01-01
      相关资源
      最近更新 更多