找出芹菜任务是否存在

2024-10-05 13:58:51 发布

您现在位置:Python中文网/ 问答频道 /正文

是否可以找出具有特定任务id的任务是否存在?当我试图获得身份时,我将一直处于等待状态。

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

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

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


Tags: 字符串id状态status身份芹菜pendingasyncresult
3条回答

现在我使用以下方案:

  1. 获取任务id
  2. 设置为memcache键,如“task\u%s”%task.id消息“Started”。
  3. 将任务id传递给客户端。
  4. 现在我可以从客户端监视任务状态(从任务消息设置为memcache)。
  5. 从任务启动就绪-设置为memcache密钥消息“就绪”。
  6. 从客户端启动任务准备-启动将从memcache中删除密钥的特殊任务,并执行必要的清理操作。

芹菜在任务发送时不写状态,这在一定程度上是一种优化 (见http://docs.celeryproject.org/en/latest/userguide/tasks.html#state)。

如果您真的需要,可以简单地添加:

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

然后,您可以测试挂起状态,以检测任务没有(似乎没有) 已发送:

>>> result.state != "PENDING"

AsyncResult.state在任务ID未知的情况下返回挂起。

PENDING

Task is waiting for execution or unknown. Any task id that is not known is implied to be in the pending state.

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"
... 

相关问题 更多 >

    热门问题