Как структурировать задачи сельдерея - программирование
Подтвердить что ты не робот

Как структурировать задачи сельдерея

У меня есть 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

Итак, есть ли какая-либо передовая практика для организации нескольких файлов задач?

4b9b3361

Ответ 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