Задача сельдерея с атрибутом time_start в 1970 году

Проверка текущих задач time_start показывает странную time_start метку time_start:

>> 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}]}

time_start присваивает задание еще в 1970 году (до создания Celery, Python и я не time_start владельцем настраиваемого DeLorean):

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

Я неверно истолковываю атрибут time_task? Является ли мое приложение для сельдерея неправильно настроенным?

Я использую Celery 3.1.4 на Linux с приложением Django и бэкэндом Redis.

Задачи выполняются работником, который выполняется следующим образом:

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

Ответы

Ответ 1

Я нашел ответ на свой вопрос, копая в коде time_start и time_start атрибут time_start задачи вычисляется функцией kombu.five.monotonic. (Как ни странно, код комбу также ссылается на другой fooobar.com/info/15093/... для справки). Временная метка, возвращаемая этой функцией, относится к "монотонному" времени, вычисленному системным вызовом clock_gettime.

Как поясняется в документации clock_gettime, это монотонное время представляет собой время, прошедшее с "неопределенной отправной точки". Цель этой функции - следить за тем, чтобы время монотонно возрастало, несмотря на изменения других значений часов.

Таким образом, чтобы получить реальное время и время начала задания, нам просто нужно сравнить атрибут time_start с текущим значением монотонных часов:

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

EDIT: атрибут time_start о котором сообщает проверка, больше не является монотонным: https://github.com/celery/celery/pull/3684 И мне потребовалось всего четыре года, чтобы написать правильный запрос на получение 0 :-)