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!
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.
Comentários muito úteis
Você pode finalizar objetos de assinatura congelando-os:
Você pode especificar o id para qualquer tarefa:
Para fazer algo quando uma tarefa é chamada, você pode usar before_task_publish ou
after_task_publish signs (consulte Signal Basics )