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