celerybeat автоматически отключает периодическую задачу

Я хочу создать периодическую задачу для сельдерея, используя интерфейс администратора django-celery. У меня настроена задача, которая отлично работает при вызове вручную или по сценарию. Он просто не работает через celerybeat. Согласно журналам отладки, при первом извлечении задача устанавливается на enabled = False, и мне интересно, почему.

При добавлении периодической задачи и передаче [1, False] в качестве позиционных аргументов задача автоматически отключается, и я не вижу никакого дальнейшего вывода. При добавлении без аргументов задача выполняется, но мгновенно вызывает исключение, потому что я не предоставил необходимые аргументы (имеет смысл).

Кто-нибудь видит, в чем здесь проблема?

Заранее спасибо.

Это вывод после предоставления аргументов:

[DEBUG/Beat] SELECT "djcelery_periodictask"."id", [...] 
             FROM "djcelery_periodictask" 
             WHERE "djcelery_periodictask"."enabled" = true ; args=(True,)

[DEBUG/Beat] SELECT "djcelery_intervalschedule"."id", [...] 
             FROM "djcelery_intervalschedule" 
             WHERE "djcelery_intervalschedule"."id" = 3 ; args=(3,)

[DEBUG/Beat] SELECT (1) AS "a" 
             FROM "djcelery_periodictask" 
             WHERE "djcelery_periodictask"."id" = 3  LIMIT 1; args=(3,)

[DEBUG/Beat] UPDATE "djcelery_periodictask" 
             SET "name" = E'<taskname>', "task" = E'<task.module.path>', 
                 "interval_id" = 3, "crontab_id" = NULL, 
                 "args" = E'[1, False,]', "kwargs" = E'{}', "queue" = NULL, 
                 "exchange" = NULL, "routing_key" = NULL, 
                 "expires" = NULL, "enabled" = false, 
                 "last_run_at" = E'2011-05-25 00:45:23.242387', "total_run_count" = 9, 
                 "date_changed" = E'2011-05-25 09:28:06.201148' 
             WHERE "djcelery_periodictask"."id" = 3; 
             args=(
                   u'<periodic-task-name>', u'<task.module.path>', 
                   3, u'[1, False,]', u'{}', 
                   False, u'2011-05-25 00:45:23.242387', 9, 
                   u'2011-05-25 09:28:06.201148', 3
             )

[DEBUG/Beat] Current schedule:
<ModelEntry: celery.backend_cleanup celery.backend_cleanup(*[], **{}) {<crontab: 0 4 * (m/h/d)>}
[DEBUG/Beat] Celerybeat: Waking up in 5.00 seconds.

EDIT: работает со следующими настройками. Я до сих пор не понимаю, почему это не работает с django-celery.

CELERYBEAT_SCHEDULE = {
    "example": {
        "task": "<task.module.path>",
        "schedule": crontab(),
        "args": (1, False)
    },
}

person jnns    schedule 25.05.2011    source источник
comment
Можете ли вы опубликовать свою задачу и конфигурацию PeriodTask?   -  person Ken Cochrane    schedule 25.05.2011
comment
Спасибо за внимание к моей проблеме. Я не устанавливал CELERYBEAT_SCHEDULE, потому что вместо этого использовал администрирование django-celery. Я также проверил часто задаваемые вопросы но, как я сказал в исходной публикации, я могу запустить задачу из оболочки вручную. Есть ли что-то еще, что я мог упустить из виду?   -  person jnns    schedule 25.05.2011
comment
У вас точно такая же проблема... Любые решения?   -  person Aldarund    schedule 15.06.2011
comment
Вы пробовали ставить задачи в settings.py с помощью CELERYBEAT_SCHEDULE?   -  person jnns    schedule 15.06.2011
comment
Да, он отлично работает с CELERYBEAT_SCHEDULE. Но мне нужно, чтобы он работал с администратором django.   -  person Aldarund    schedule 15.06.2011
comment
Глупый вопрос. Вы установили переменную CELERYBEAT_SCHEDULER таким образом? CELERYBEAT_SCHEDULER = djcelery.schedulers.DatabaseScheduler   -  person Mauro Rocco    schedule 15.06.2011


Ответы (2)


Я была такая же проблема. Убедитесь, что аргументы имеют формат JSON. Например, попробуйте установить для позиционных аргументов значение [1, false] — «ложь» в нижнем регистре — я только что проверил это на экземпляре django-celery (версия 2.2.4), и это сработало.

Для аргументов ключевого слова используйте что-то вроде {"name": "aldarund"}

person Evan    schedule 21.06.2011
comment
Да, подтверждаю, проблема в кодировке. На самом деле для строковых аргументов вы должны использовать двойные кавычки вместо одинарных '. - person Mauro Rocco; 11.07.2011

У меня тоже такая же проблема.

С описанием моделей PeriodicTask в djcelery («позиционные аргументы в кодировке JSON»), так же, как и ответ Эвана. Я пытаюсь использовать python json lib для кодирования перед сохранением.

И эта работа со мной

import json 
o = PeriodicTask()
o.kwargs = json.dumps({'myargs': 'hello'})
o.save()

сельдерей версия 3.0.11

person Hardy    schedule 09.10.2012