Как структурировать задачи сельдерея
У меня есть 2 типа задач: асинхронные задачи и задачи расписания. Итак, вот моя структура:
proj
|
-- tasks
|
-- __init__.py
|
-- celeryapp.py => celery instance defined in this file.
|
-- celeryconfig.py
|
-- async
| |
| -- __init__.py
| |
| -- task1.py => from proj.tasks.celeryapp import celery
| |
| -- task2.py => from proj.tasks.celeryapp import celery
|
-- schedule
|
-- __init__.py
|
-- task1.py => from proj.tasks.celeryapp import celery
|
-- task2.py => from proj.tasks.celeryapp import celery
Но когда я запускаю работника сельдерея, как показано ниже, он не работает. Он не может принять задание от планировщика бильярда.
$ celery worker --app=tasks -Q my_queue,default_queue
Итак, есть ли какая-либо передовая практика для организации нескольких файлов задач?
Ответы
Ответ 1
На основе сельдерея документация вы можете импортировать структуру задач сельдерея следующим образом:
Например, если у вас есть (воображаемое) дерево каталогов:
|
|-- foo
| |-- __init__.py
| |-- tasks.py
|
|-- bar
|-- __init__.py
|-- tasks.py
Тогда вызов app.autodiscover_tasks(['foo', bar'])
приведет к импортированию модулей foo.tasks и bar.tasks.
Ответ 2
Задачи сельдерея могут быть асинхронными, синхронизируемыми или запланированными, зависят от его вызова
task.delay(arg1,arg2) #will be async
task.delay(arg1,arg2).get() #will be sync
task.delay(arg1,arg2).get() #will be sync
task.apply_async(args = [arg1,arg2], {'countdown' : some_seconds}) #async with delay
Там много запросов в зависимости от ваших потребностей
Тем не менее, вы должны начать сельдерей с флагом -B, чтобы включить планировщик сельдерея
$ celery worker --app=tasks -B -Q my_queue,default_queue
Таким образом, способ, которым вы занимаетесь, чтобы организовать свои задачи, является чем-то личным, и он зависит от сложности вашего проекта, но я думаю, что организовать их по типу синхронизации не будет лучшим вариантом.
Я искал эту тему, и я не нашел никакого руководства или советов, но я прочитал несколько случаев, которые организуют их задачу по их функциональности.
Я следил за этим советом, потому что это не шаблон, в моих проектах. Вот один пример того, как я сделал
your_app
|
-- reports
|
-- __init__.py
-- foo_report.py
-- bar_report.py
-- tasks
|
-- __init__.py
-- report_task.py
-- maintenance
|
-- __init__.py
-- tasks
|
-- __init__.py
-- delete_old_stuff_task.py
-- twitter
|
-- __init__.py
-- tasks
|
-- __init__.py
-- batch_timeline.py