Celery: Получить идентификатор задачи сельдерея перед вызовом `delay`

Созданный на 22 янв. 2014  ·  3Комментарии  ·  Источник: celery/celery

В своем приложении я использую таблицу для отслеживания и хранения дополнительной информации о запущенных задачах (назовем ее таблицей задач приложения). В некоторых случаях мне нужен идентификатор созданной записи задачи приложения в реальной задаче сельдерея. Проблема в том, что эта запись задачи приложения создается только после ее запуска (поскольку идентификатор задачи сельдерея является частью записи идентификатора задачи приложения) и что будет трудно передать идентификатор задачи в выполняющуюся задачу.

По сути, мне нужен идентификатор задачи сельдерея для создания записи задачи приложения, и мне нужен идентификатор задачи приложения для создания задачи сельдерея.

Есть ли какой-нибудь надежный способ решить эту проблему курицы и яйца? Один из способов, который я могу придумать, - это каким-то образом остановить выполнение, пока я не создам запись задачи приложения (в вызывающем 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 сигналы (см. Основы сигналов )

Все 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 рейтинги