查看芹菜任务是否存在

新手上路,请多包涵

是否可以找出具有特定任务 ID 的任务是否存在?当我尝试获取状态时,我将始终处于待定状态。

 >>> AsyncResult('...').status
'PENDING'

我想知道给定的任务 ID 是否是真正的芹菜任务 ID 而不是随机字符串。我想要不同的结果,具体取决于某个 ID 是否存在有效任务。

过去可能有一个具有相同 ID 的有效任务,但结果可能已从后端删除。

原文由 dominik 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 415
2 个回答

Celery 在发送任务时不会写入状态,这在一定程度上是一种优化(请参阅 文档)。

如果您确实需要它,添加起来很简单:

 from celery import current_app
# `after_task_publish` is available in celery 3.1+
# for older versions use the deprecated `task_sent` signal
from celery.signals import after_task_publish

# when using celery versions older than 4.0, use body instead of headers

@after_task_publish.connect
def update_sent_state(sender=None, headers=None, **kwargs):
    # the task may not exist if sent using `send_task` which
    # sends tasks by name, so fall back to the default result backend
    # if that is the case.
    task = current_app.tasks.get(sender)
    backend = task.backend if task else current_app.backend

    backend.store_result(headers['id'], None, "SENT")

然后您可以测试 PENDING 状态以检测任务是否(看似)未发送:

 >>> result.state != "PENDING"

原文由 asksol 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果任务 ID 未知,AsyncResult.state 会返回 PENDING。

待办的

任务正在等待执行或未知。任何未知的任务 ID 都暗示处于挂起状态。

http://docs.celeryproject.org/en/latest/userguide/tasks.html#pending

如果您需要将未知 ID 与现有 ID 区分开来,您可以提供自定义任务 ID:

 >>> from tasks import add
>>> from celery.utils import uuid
>>> r = add.apply_async(args=[1, 2], task_id="celery-task-id-"+uuid())
>>> id = r.task_id
>>> id
'celery-task-id-b774c3f9-5280-4ebe-a770-14a6977090cd'
>>> if not "blubb".startswith("celery-task-id-"): print "Unknown task id"
...
Unknown task id
>>> if not id.startswith("celery-task-id-"): print "Unknown task id"
...

原文由 mher 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题