В своем приложении я использую таблицу для отслеживания и хранения дополнительной информации о запущенных задачах (назовем ее таблицей задач приложения). В некоторых случаях мне нужен идентификатор созданной записи задачи приложения в реальной задаче сельдерея. Проблема в том, что эта запись задачи приложения создается только после ее запуска (поскольку идентификатор задачи сельдерея является частью записи идентификатора задачи приложения) и что будет трудно передать идентификатор задачи в выполняющуюся задачу.
По сути, мне нужен идентификатор задачи сельдерея для создания записи задачи приложения, и мне нужен идентификатор задачи приложения для создания задачи сельдерея.
Есть ли какой-нибудь надежный способ решить эту проблему курицы и яйца? Один из способов, который я могу придумать, - это каким-то образом остановить выполнение, пока я не создам запись задачи приложения (в вызывающем task_function.delay()
), но я не могу придумать способ сделать это с помощью сельдерея из коробки. или как передать в задачу идентификатор задачи приложения.
Есть мысли, указатели, намеки на это? - Большое спасибо!
Вы можете завершить объекты подписи, заморозив их:
>>> 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 поддерживает несколько (хороших) решений. Отличный дизайн библиотеки.
Самый полезный комментарий
Вы можете завершить объекты подписи, заморозив их:
Вы можете указать id для любой задачи:
Чтобы что-то сделать при вызове задачи, вы можете использовать before_task_publish или
after_task_publish сигналы (см. Основы сигналов )