我有一个场景,我需要将任务的状态更新为自定义值,然后读取它并根据值应用一些逻辑。
这是我的芹菜配置:
celery = Celery(app.import_name,
backend='redis://127.0.0.1:6379/0',
broker='redis://127.0.0.1:6379/0')
celery.conf.update(CELERY_TASK_SERIALIZER='pickle',
CELERY_RESULT_BACKEND='redis://127.0.0.1:6379/0',
CELERY_IGNORE_RESULT=False,
CELERY_ALWAYS_EAGER=False,
CELERY_ACCEPT_CONTENT=['pickle'],
CELERY_RESULT_SERIALIZER='pickle')
所以我基本上使用redis + pickle。更新状态的调用类似于
self.update_state('foo')
但是当我像这样调用我的任务并检查状态时:
result = task.delay(*args)
print(result.state)
我总是得到PENDING
或SUCCESS
,因此即使明确要求更新调用,也会跳过任何中间值
如果我检查结果后端类型,我得到Redis,并且ignore_result
选项设置为False,没有我在这里找到的建议修复工作。
答案 0 :(得分:2)
如果我们查看update_state
方法的签名,它看起来像这样
def update_state(self, task_id=None, state=None, meta=None):
"""Update task state.
:keyword task_id: Id of the task to update, defaults to the
id of the current task
:keyword state: New state (:class:`str`).
:keyword meta: State metadata (:class:`dict`).
当我们跑步时
self.update_state('foo')
它尝试使用task_id foo
更新任务到州None
。
相反,我们应该尝试
self.update_state(state='foo')
将当前任务状态更新为foo
。