Como verificar se uma tarefa está sendo executada no aipo (especificamente, estou usando o celery-django)?
Eu li a documentação e pesquisei, mas não consigo ver uma chamada como:
my_example_task.state() == RUNNING
Meu caso de uso é que tenho um serviço externo (java) para transcodificação. Quando envio um documento para ser transcodificado, quero verificar se a tarefa que executa esse serviço está em execução e, caso não esteja, (re) iniciá-la.
Estou usando as versões estáveis atuais - 2.4, acredito.
python
web-services
celery
django-celery
Marcin
fonte
fonte
x
?async_result
. No seu caso de uso, você já tem a instância, está pronto para prosseguir. Mas o que acontecerá se você tiver apenas o ID da tarefa e precisar instanciar umaasync_result
instância para poder fazer a chamadaasync_result.get()
? Esta é uma instância daAsyncResult
classe, mas você não pode usar a classe brutacelery.result.AsyncResult
, você precisa obter a classe da função envolvida porapp.task()
. No seu caso, você fariaasync_result = run_instance.AsyncResult('task-id')
but you cannot use the raw class celery.result.AsyncResult, you need to get the class from the function wrapped by app.task().
- Acho que é assim que deveria ser usado. Leia o código: github.com/celery/celery/blob/…Criar um
AsyncResult
objeto a partir do id da tarefa é a forma recomendada no FAQ para obter o status da tarefa quando a única coisa que você tem é o id da tarefa.No entanto, a partir do Celery 3.x, existem advertências significativas que podem morder as pessoas se não derem atenção a elas. Realmente depende do cenário de caso de uso específico.
Por padrão, o Celery não registra um estado de "execução".
Para que o Celery registre que uma tarefa está em execução, você deve definir
task_track_started
comoTrue
. Aqui está uma tarefa simples que testa isso:Quando
task_track_started
éFalse
, que é o padrão, a exibição do estado éPENDING
mesmo que a tarefa tenha sido iniciada. Se você definirtask_track_started
comoTrue
, o estado seráSTARTED
.O estado
PENDING
significa "Não sei".Um
AsyncResult
com o estadoPENDING
não significa nada mais do que o fato de que Celery não conhece o status da tarefa. Isso pode ser por uma série de razões.Por um lado,
AsyncResult
pode ser construído com ids de tarefa inválidos. Essas "tarefas" serão consideradas pendentes pelo Celery:Ok, então ninguém vai alimentar ids obviamente inválidos para
AsyncResult
. É justo, mas também tem efeito queAsyncResult
também considerará uma tarefa que foi executada com sucesso, mas que o aipo esqueceu como sendoPENDING
. Novamente, em alguns cenários de casos de uso, isso pode ser um problema. Parte do problema gira em torno de como o Celery está configurado para manter os resultados das tarefas, porque depende da disponibilidade das "marcas para exclusão" no backend de resultados. ("Tombstones" é o termo usado na documentação do Celery para os blocos de dados que registram como a tarefa terminou.) O usoAsyncResult
não funcionará setask_ignore_result
forTrue
. Um problema mais irritante é que o Celery expira as marcas de exclusão por padrão. oresult_expires
configuração padrão é 24 horas. Portanto, se você iniciar uma tarefa e registrar a id no armazenamento de longo prazo, e mais 24 horas depois, criar umAsyncResult
com ela, o status seráPENDING
.Todas as "tarefas reais" começam no
PENDING
estado. Portanto, realizarPENDING
uma tarefa pode significar que a tarefa foi solicitada, mas nunca avançou além disso (por qualquer motivo). Ou pode significar que a tarefa foi executada, mas Celery esqueceu seu estado.Ai!
AsyncResult
não vai funcionar para mim. O que mais eu posso fazer?Prefiro controlar as metas do que as tarefas em si . Eu mantenho algumas informações sobre as tarefas, mas elas são secundárias para manter o controle dos objetivos. As metas são armazenadas em armazenamento independente do Aipo. Quando uma solicitação precisa realizar um cálculo depende de algum objetivo ter sido alcançado, ele verifica se o objetivo já foi alcançado, se sim, então ele usa este objetivo em cache, caso contrário, ele inicia a tarefa que afetará o objetivo e envia para o cliente que fez a solicitação HTTP uma resposta que indica que ele deve esperar por um resultado.
Os nomes de variáveis e hiperlinks acima são para Celery 4.x. Em 3.x as variáveis e hiperlinks correspondentes são:
CELERY_TRACK_STARTED
,CELERY_IGNORE_RESULT
,CELERY_TASK_RESULT_EXPIRES
.fonte
Todo
Task
objeto possui uma.request
propriedade, que o contémAsyncRequest
. Consequentemente, a linha a seguir fornece o estado de uma Tarefatask
:fonte
Você também pode criar estados personalizados e atualizar seu valor na execução da tarefa. Este exemplo é do docs:
http://celery.readthedocs.org/en/latest/userguide/tasks.html#custom-states
fonte
Pergunta antiga, mas recentemente me deparei com esse problema.
Se você está tentando obter o task_id, pode fazer assim:
Agora você sabe exatamente o que é task_id e pode usá-lo para obter o AsyncResult:
fonte
apply_async
. O objeto retornado porapply_async
é umAsyncResult
objeto, que possui o id da tarefa que o Celery gerou.task_id
exigir que você mesmo gere um ID de tarefa. Em seu comentário, você imaginou um motivo que vai além de "como faço para verificar o status da tarefa" e "Se você está tentando obter o task_id ...` Ótimo se você tiver essa necessidade, mas não é o caso aqui. (Além disso, usaruuid()
para gerar um id de tarefa não faz absolutamente nada além do que o Celery faz por padrão.)Basta usar esta API do FAQ do aipo
Isso funciona bem.
fonte
Resposta de 2020:
fonte
Experimentar:
task.AsyncResult(task.request.id).state
isso fornecerá o status da Tarefa de aipo. Se a tarefa de aipo já estiver no estado de FALHA, ela lançará uma exceção:
raised unexpected: KeyError('exc_type',)
fonte
para tarefas simples, podemos usar http://flower.readthedocs.io/en/latest/screenshots.html e http://policystat.github.io/jobtastic/ para fazer o monitoramento.
e para tarefas complicadas, digamos uma tarefa que lida com muitos outros módulos. Recomendamos registrar manualmente o progresso e a mensagem na unidade de tarefa específica.
fonte
Encontrei informações úteis no
Guia dos Trabalhadores do Projeto de Aipo trabalhadores-inspetores
No meu caso, estou verificando se o Celery está funcionando.
Você pode brincar com inspecionar para atender às suas necessidades.
fonte
vi my_celery_apps / app1.py
vi tasks / task1.py
fonte
Além da abordagem programática acima, o status da Tarefa de flores pode ser facilmente visto.
Monitoramento em tempo real usando Celery Events. Flower é uma ferramenta baseada na web para monitorar e administrar clusters de Celery.
Documento oficial: Flor - ferramenta de monitoramento de aipo
Instalação:
Uso:
fonte
fonte