Celery: 在调用 `delay` 之前获取 celery 任务 ID

创建于 2014-01-22  ·  3评论  ·  资料来源: celery/celery

在我的应用程序中,我使用一个表来跟踪和存储已启动任务的附加信息(称为应用程序任务表)。 在某些情况下,我需要在实际 celery 任务中创建应用程序任务记录的 ID。 问题是该应用程序任务记录仅在任务启动后创建(因为 celery 任务 ID 是应用程序任务 ID 记录的一部分),并且很难将任务 ID 传递到正在运行的任务中。

本质上,我需要 celery 任务 id 来创建应用程序任务记录,我需要应用程序任务 id 来创建 celery 任务。

有没有什么有效的方法可以解决这个先有鸡还是先有蛋的问题? 我能想到的一种方法是以某种方式停止执行,直到我创建了应用程序任务记录(在task_function.delay()的调用者中),但我想不出一种开箱即用的 celery 方法或如何将应用程序任务 id 传递给任务。

任何想法,指针,提示? - 非常感谢!

最有用的评论

您可以通过冻结签名对象来完成它们:

>>> sig = add.s(2, 2)
>>> sig.freeze()
<AsyncResult: e89ff8f1-a556-4bb7-8b9e-5db9806ca082>
>>> sig.delay()
<AsyncResult: e89ff8f1-a556-4bb7-8b9e-5db9806ca082>

>>> sig = group(add.s(i, i) for i in range(5))
>>> sig.freeze()
<GroupResult: 9b4a8bf0-2f81-43fe-a5a0-23563441b25d [6eb971bc-ad3b-4f8f-9724-5b2baa493369, 2390bada-76f7-4680-8013-e9da78bf6a68, c5c510c1-80ed-49bc-aaaa-7ddbd5d025d2, 9be6363e-7290-407b-8c54-d6baf90d99d6, 35502fc1-9ce9-44df-917b-a6026daed646]>
>>> sig.delay()
<GroupResult: 9b4a8bf0-2f81-43fe-a5a0-23563441b25d [6eb971bc-ad3b-4f8f-9724-5b2baa493369, 2390bada-76f7-4680-8013-e9da78bf6a68, c5c510c1-80ed-49bc-aaaa-7ddbd5d025d2, 9be6363e-7290-407b-8c54-d6baf90d99d6, 35502fc1-9ce9-44df-917b-a6026daed646]>

您可以为任何任务指定 id:

 >>> from celery import uuid
 >>> task_id = uuid()
 >>> task_id
'c7f388e9-d688-4f1d-be22-fb043b93c725'
 >>> add.apply_async((2, 2), task_id=task_id)
 <AsyncResult: c7f388e9-d688-4f1d-be22-fb043b93c725>

要在调用任务时执行某些操作,您可以使用before_task_publish
after_task_publish信号(请参阅信号基础知识

所有3条评论

您可以通过冻结签名对象来完成它们:

>>> sig = add.s(2, 2)
>>> sig.freeze()
<AsyncResult: e89ff8f1-a556-4bb7-8b9e-5db9806ca082>
>>> sig.delay()
<AsyncResult: e89ff8f1-a556-4bb7-8b9e-5db9806ca082>

>>> sig = group(add.s(i, i) for i in range(5))
>>> sig.freeze()
<GroupResult: 9b4a8bf0-2f81-43fe-a5a0-23563441b25d [6eb971bc-ad3b-4f8f-9724-5b2baa493369, 2390bada-76f7-4680-8013-e9da78bf6a68, c5c510c1-80ed-49bc-aaaa-7ddbd5d025d2, 9be6363e-7290-407b-8c54-d6baf90d99d6, 35502fc1-9ce9-44df-917b-a6026daed646]>
>>> sig.delay()
<GroupResult: 9b4a8bf0-2f81-43fe-a5a0-23563441b25d [6eb971bc-ad3b-4f8f-9724-5b2baa493369, 2390bada-76f7-4680-8013-e9da78bf6a68, c5c510c1-80ed-49bc-aaaa-7ddbd5d025d2, 9be6363e-7290-407b-8c54-d6baf90d99d6, 35502fc1-9ce9-44df-917b-a6026daed646]>

您可以为任何任务指定 id:

 >>> from celery import uuid
 >>> task_id = uuid()
 >>> task_id
'c7f388e9-d688-4f1d-be22-fb043b93c725'
 >>> add.apply_async((2, 2), task_id=task_id)
 <AsyncResult: c7f388e9-d688-4f1d-be22-fb043b93c725>

要在调用任务时执行某些操作,您可以使用before_task_publish
after_task_publish信号(请参阅信号基础知识

非常感谢。 我选择了task_id = uuid()选项。 它就像一个魅力!

我知道这是旧的,但看到我不是唯一一个有这样用例的人真是太棒了——而且看到 Celery 支持几个(好的)解决方案也很棒。 很棒的图书馆设计。

此页面是否有帮助?
0 / 5 - 0 等级