2013-11-20 2 views
18

инспекции в настоящее время работает задач Сельдерей показывает странные time_start TIMESTAMP:сельдерея задача с атрибутом TIME_START в 1970

>> 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 датирует задача вернуться к (это еще до создания сельдерея, Python, и я не являюсь владельцем настроенную 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' 
+0

Спасибо за ваш интерес! Я добавил пару деталей. –

+0

следующие вопросы: какая у вас ОС? все задачи с такими странными start_times или только с некоторыми из них? и какова ваша стоимость даты на машине с рабочими? – alko

+0

Временная метка не является меткой времени UNIX, она использует 'time.monotonic()', поэтому она может оказаться нецелесообразной вне процесса (в зависимости от реализации монотонного) – asksol

ответ

25

Я нашел ответ на свой вопрос, выкопав в коде сельдерея и комбу: атрибут задачи time_start вычисляется по kombu.five.monotonic функция. (Как ни странно, код комбу также относится к другому StackOverflow question для справки). Временная метка, возвращаемая этой функцией, относится к «монотонному» времени, вычисленному системным вызовом clock_gettime.

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

Таким образом, для того, чтобы получить реальную DateTime, на котором была начата задача, нам нужно просто сравнить атрибут 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 :-)

+0

Не прокомментировал перед тем, как прочитать свой ответ :) Примечание. что монотонное время полезно только на одной машине. Мы могли бы предоставить контрольную отметку времени в результатах проверки, если вам это нужно (вы можете открыть запрос функции на трекер-вопроснике по сельдерею github) – asksol

+0

Это было бы здорово! Я это сделаю. –

+4

Это работает очень хорошо, пока у вас не будет более одной машины, использующей сельдерей. Когда это происходит, «монотонность» текущего компьютера просто не подходит для каждой задачи. – Hassek

Смежные вопросы