Я использую Celery 4.0.1
с Django 1.10
, и у меня есть задачи планирования задач (выполнение задачи работает нормально). Вот конфигурация сельдерея:Динамическое использование периодических задач в сельдерее (celerybeat) с использованием add_periodic_task
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myapp.settings')
app = Celery('myapp')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
app.conf.BROKER_URL = 'amqp://{}:{}@{}'.format(settings.AMQP_USER, settings.AMQP_PASSWORD, settings.AMQP_HOST)
app.conf.CELERY_DEFAULT_EXCHANGE = 'myapp.celery'
app.conf.CELERY_DEFAULT_QUEUE = 'myapp.celery_default'
app.conf.CELERY_TASK_SERIALIZER = 'json'
app.conf.CELERY_ACCEPT_CONTENT = ['json']
app.conf.CELERY_IGNORE_RESULT = True
app.conf.CELERY_DISABLE_RATE_LIMITS = True
app.conf.BROKER_POOL_LIMIT = 2
app.conf.CELERY_QUEUES = (
Queue('myapp.celery_default'),
Queue('myapp.queue1'),
Queue('myapp.queue2'),
Queue('myapp.queue3'),
)
Тогда в tasks.py у меня есть:
@app.task(queue='myapp.queue1')
def my_task(some_id):
print("Doing something with", some_id)
В views.py я хочу запланировать эту задачу:
def my_view(request, id):
app.add_periodic_task(10, my_task.s(id))
Тогда я исполняю команды:
sudo systemctl start rabbitmq.service
celery -A myapp.celery_app beat -l debug
celery worker -A myapp.celery_app
Но задача никогда не планировалось. Я ничего не вижу в журналах. Задача работает, потому что, если, на мой взгляд, я:
def my_view(request, id):
my_task.delay(id)
Задача выполнена.
Если в моем файле конфигурации, если я запланировать задачу вручную, как это работает:
app.conf.CELERYBEAT_SCHEDULE = {
'add-every-30-seconds': {
'task': 'tasks.my_task',
'schedule': 10.0,
'args': (66,)
},
}
Я просто не могу запланировать задачу динамически. Есть идеи?
Подобрав на ваш комментарий «На самом деле вы не можете не определить периодическую задачу на уровне представления»: Можно ли используйте 'add_periodic_task()' на уровне приложения, то есть в 'task.py'? Кажется, лучше инкапсулировать, чтобы эти периодические задачи были объявлены в приложении. –
На самом деле вовсе не нужно его использовать, поскольку он будет вызываться для вас, если вы просто используете синтаксис настроек 'app.conf.CELERYBEAT_SCHEDULE', но если вы хотите использовать его явно, вы можете использовать его в' task.py' файл. – DhiaTN
Я считаю, что последняя версия (после версии 4.1.0) должна иметь этот адрес. Вот разработчик, который работает [# 3958] (https://github.com/celery/celery/pull/3958) –