setup run beat app and python django redis celery celery-task

python - run - Tarea de apio con un atributo time_start en 1970



run celery (1)

Encontré la respuesta a mi propia pregunta cavando en el código de Apio y Kombu: el atributo time_start de una tarea se calcula mediante la función kombu.five.monotonic . (Irónicamente, el código kombu también hace referencia a otra pregunta de StackOverflow como referencia) La marca de tiempo devuelta por esa función se refiere a un tiempo "monotónico" calculado por la clock_gettime sistema clock_gettime .

Como se explica en la documentation clock_gettime , este tiempo monotónico representa el tiempo transcurrido "desde algún punto de inicio no especificado". El propósito de esta función es asegurarse de que el tiempo aumente monótonamente, a pesar de los cambios de otros valores de reloj.

Por lo tanto, para obtener la fecha y hora real en la que se inició la tarea, solo necesitamos comparar el atributo time_start con el valor actual del reloj monotónico:

>> from datetime import datetime >> from time import time >> import kombu.five >> datetime.fromtimestamp(time() - (kombu.five.monotonic() - 9636801.218162088)) datetime.datetime(2013, 11, 20, 9, 55, 56, 193768)

EDITAR: el atributo time_start reportado por la inspección ya no es monotónico: https://github.com/celery/celery/pull/3684 Y solo me tomó cuatro años escribir una solicitud de extracción adecuada 0 :-)

Una inspección de las tareas de apio que se están ejecutando actualmente revela una time_start tiempo de time_start tiempo extraña:

>> celery.app.control.inspect().active() {u''[email protected]'': [{u''acknowledged'': True, u''args'': u''(...,)'', u''delivery_info'': {u''exchange'': u''celery'', u''priority'': 0, u''redelivered'': None, u''routing_key'': u''celery''}, u''hostname'': u''[email protected]'', u''id'': u''3d92fdfd-524e-4ba1-98cb-cf83af2ad8e9'', u''kwargs'': u''{}'', u''name'': u''task_name'', u''time_start'': 9636801.218162088, u''worker_pid'': 7931}]}

El atributo time_start remonta la tarea a 1970 (eso es antes de la creación de Celery, Python y no tengo un DeLorean personalizado):

>> from datetime import datetime >> datetime.fromtimestamp(9636801.218162088) datetime.datetime(1970, 4, 22, 13, 53, 21, 218162)

¿Estoy malinterpretando el atributo time_task ? ¿Mi aplicación de apio está mal configurada?

Estoy usando Celery 3.1.4 en Linux con una aplicación Django y un backend Redis.

Las tareas son ejecutadas por un trabajador que se ejecuta de la siguiente manera:

./manage.py celery worker --loglevel=INFO --soft-time-limit=600 --logfile=/tmp/w1.log --pidfile=/tmp/w1.pid -n ''w1.%%h''