python celery

python - ¿Hay alguna forma de detener de forma no violenta la tarea particular del trabajador del apio?



celery (2)

Como indica la documentation Celery, la tarea que ya se está ejecutando no se .revoke() llamando a .revoke() , a menos que se establezca terminate=True . Pero eso no se recomienda, ya que matará al propio trabajador, que ya podría haber comenzado otra tarea. ¿Eso significa que no hay una manera confiable y estable de hacer eso?

EDITAR: celery.contrib.abortable no me conviene, porque, como indica la documentación, solo funciona con bases de datos.


Puede enviar una señal HUP en lugar de TERM, que reinicia con gracia el proceso secundario sin matar al trabajador.

In [80]: import signal In [81]: x = add.delay(1, 2) In [82]: x.revoke(terminate=True, signal=signal.SIGHUP)


Una tarea en ejecución es un subproceso en ejecución del trabajador (cuando se usa prefork), esto significa que la única forma de abortar una tarea es eliminar el subproceso que lo ejecuta.

Puede intentar experimentar su propia implementación del manejo de eventos revocados tratando de averiguar la ID de subproceso y eliminar solo esa, pero honestamente no sé si vale la pena y si realmente puede funcionar.

Creo que la respuesta corta es que no puedes.

De todos modos, a veces es necesario matar al trabajador, especialmente en las fases iniciales de los proyectos en los que aún necesita dimensionar correctamente los recursos, solo asegúrese de registrar en algún lugar las tareas en ejecución para poder reprogramarlas o simplemente usar CELERY_ACKS_LATE