Celery: Obtenha o ID da tarefa de aipo antes de chamar `delay`

Criado em 22 jan. 2014  ·  3Comentários  ·  Fonte: celery/celery

Em meu aplicativo, eu uso uma tabela para controlar e armazenar informações adicionais das tarefas iniciadas (chame-a de tabela de tarefas do aplicativo). Em alguns casos, preciso do ID do registro da tarefa do aplicativo criado na tarefa real do aipo. O problema é que esse registro de tarefa do aplicativo só é criado depois que a tarefa é iniciada (porque o ID da tarefa do aipo faz parte do registro do ID da tarefa do aplicativo) e será difícil passar o ID da tarefa para uma tarefa em execução.

Em essência, preciso do ID da tarefa do aipo para criar o registro da tarefa do aplicativo e preciso do ID da tarefa do aplicativo para criar a tarefa do aipo.

Existe alguma maneira robusta de resolver esse problema do ovo e da galinha? Uma maneira que posso pensar é parar a execução de alguma forma até que eu crie o registro de tarefa do aplicativo (no chamador de task_function.delay() ), mas não consigo pensar em uma maneira de fazer isso com aipo pronto para uso ou como passar o id de tarefa do aplicativo para a tarefa.

Quaisquer pensamentos, sugestões, dicas sobre isso? - Muito obrigado!

Comentários muito úteis

Você pode finalizar objetos de assinatura congelando-os:

>>> 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]>

Você pode especificar o id para qualquer tarefa:

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

Para fazer algo quando uma tarefa é chamada, você pode usar before_task_publish ou
after_task_publish signs (consulte Signal Basics )

Todos 3 comentários

Você pode finalizar objetos de assinatura congelando-os:

>>> 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]>

Você pode especificar o id para qualquer tarefa:

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

Para fazer algo quando uma tarefa é chamada, você pode usar before_task_publish ou
after_task_publish signs (consulte Signal Basics )

Muito obrigado. Eu escolhi a opção task_id = uuid() . Ele funciona como um encanto!

Eu sei que isso é antigo, mas foi incrível ver que eu não era o único com um caso de uso como esse - e também foi incrível ver que o Celery oferece suporte a várias (boas) soluções. Excelente design de biblioteca.

Esta página foi útil?
0 / 5 - 0 avaliações