Я пытаюсь настроить django + celery + redis + celery_beats, но это вызывает у меня проблемы. Документация довольно проста, но когда я запускаю сервер django, redis, celery и celery beats, ничего не печатается и не регистрируется (все мои тестовые задачи что-то делают в журнале).
Это моя структура папок:
- aenima
- aenima
- __init__.py
- celery.py
- criptoball
- tasks.py
celery.py выглядит так:
from __future__ import absolute_import, unicode_literals
import os
from django.conf import settings
from celery import Celery
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'aenima.settings')
app = Celery("criptoball")
app.conf.broker_url = 'redis://localhost:6379/0'
# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')
# Load task modules from all registered Django app configs.
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
app.conf.timezone = 'UTC'
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
app.conf.beat_schedule = {
'test-every-30-seconds': {
'task': 'tasks.test_celery',
'schedule': 30.0,
'args': (16, 16)
}, }
и tasks.py выглядит так:
from __future__ import absolute_import, unicode_literals
from datetime import datetime, timedelta
from celery import shared_task
import logging
from django_celery_beat.models import PeriodicTask, IntervalSchedule
cada_10_seg = IntervalSchedule.objects.create(every=10, period=IntervalSchedule.SECONDS)
test_celery_periodic = PeriodicTask.objects.create(interval=cada_10_seg, name='test_celery', task='criptoball.tasks.test_celery',
expires=datetime.utcnow()+timedelta(seconds=30))
@shared_task
def test_celery(x, y):
logger = logging.getLogger("AENIMA")
print("EUREKA")
logger.debug("EUREKA")
Это документы django_celery_beat
Не уверен, что мне не хватает. Когда я бегу
сельдерей -Aenima beat -l debug --scheduler django_celery_beat.schedulers: DatabaseScheduler
сельдерей -Aenima worker -l debug
повторный клик PONG
django runserver и redis server, я ничего не печатаю.
settings.py
CELERY_BROKER_URL = 'redis://localhost:6379'
CELERY_RESULT_BACKEND = 'redis://localhost:6379'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = TIME_ZONE
CELERY_IMPORTS = ('criptoball.tasks',)
Пока не нашел никакого авторитетного ответа на эту тему в SO.
Я бы хотел все исправить, эта ошибка может быть лишь одной из многих. Спасибо большое за вашу помощь!
Изменить:
Добавлены настройки для redis, по-другому объявлена задача и повышен уровень отладки. Теперь ошибка:
Получено незарегистрированное задание типа u'tasks.test_celery '. Сообщение было проигнорировано и отклонено.
Вы не забыли импортировать модуль, содержащий эту задачу? Или, может быть, вы используете относительный импорт? KeyError: u'aenima.criptoball.tasks.test_celery '
Я считаю, что документация Celery оставляет желать лучшего.
РЕДАКТИРОВАТЬ 2. Попробовав все, это сработало, когда я поместил все задачи в один файл celery.py. @shared_task не работает, пришлось использовать @ app.task.
celery worker -A <your_module_name>
. Материал должен печататься в терминале, с которого вы это начали. - person Chris   schedule 04.02.2018celery -A aenima beat celery -A aenima worker -l info
может быть ошибкой транскрипции / форматирования. Вы хотели поместить их на две отдельные строчки? - person sytech   schedule 28.03.2018print
и.debug
могут не отображаться, даже если задача действительно выполняется. По моему опыту, мне также пришлось указать планировщик какDatabaseScheduler
, чтобы решить аналогичную проблему с celery_results, но не уверен, применимо ли это здесь. - person sytech   schedule 28.03.2018Celery('criptoball')
наCelery('aenima')
, как говорится в документации, чтобы использовать имя project. Я догадываюсь, что от этого зависит, какautodiscover_tasks
находит ваши задачи. Также я не уверен, почему у вас этоlambda
в задачах автообнаружения, может быть подозрительным. - person sytech   schedule 28.03.2018criptoball
в вашем списке установленных приложений в django? - person 2ps   schedule 29.03.2018