Как выполнять периодические задачи одновременно с Сельдереем и Джанго

#python #django #celery

Вопрос:

У меня есть несколько задач, выполняемых сельдереем в моем проекте Django.

Я использую контрабас, чтобы указать время выполнения задачи, вот так:

 from celery.schedules import crontab

CELERY_BEAT_SCHEDULE = {
    'task_a': {
        'task': 'tasks.task_a',
        'schedule': crontab(minute=0, hour='5,18'),
    },
    'task_b': {
        'task': 'tasks.task_b',
        'schedule': crontab(minute=4, hour='5,18'),
    },
}
 

Что происходит, так это то, что одна задача выполняется, и только примерно через 5 минут начинается другая. Когда они должны быть выполнены одновременно.

Я бы хотел, чтобы все они начинались одновременно, но это не то, что происходит

всего существует около восьми задач, выполнение некоторых из которых занимает много времени

В данный момент я использую следующую команду

поначалу все было так

 celery -A api worker  --concurrency=4 -n <name>
 

затем я попытался

 celery -A api multi  --concurrency=4 -n <name>
 

и, наконец,

 celery -A api multi -P gevent --concurrency=4 -n <name>
 

Все они являются общими задачами

 @shared_task(bind=True, name="tasks.task_a")
def task_a(self):
     pass
 

и я использую autodiscover_tasks

 app = Celery('<app-name>')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
 

Ответ №1:

Похоже, это может быть проблема с оборудованием. Убедитесь, что у вас достаточно ресурсов процессора, доступных для работника сельдерея.

Параллелизм должен быть установлен на количество процессоров, доступных на вашем компьютере (по умолчанию). Если ваши задачи привязаны к процессору, пул должен быть установлен в prefork значение (по умолчанию), а не gevent (для ввода-вывода, связанного с HTTP-запросами).

Сельдерей multi должен начать несколько работ. Как правило, по умолчанию Сельдерей рекомендует 1 работника на машину. Но они действительно советуют вам провести собственное тестирование.

Редактировать: Эта ссылка отлично объясняет: https://www.distributedpython.com/2018/10/26/celery-execution-pool/

Комментарии:

1. У меня на этом сервере 8 процессоров. Я запускаю 3 рабочих с такой же конфигурацией (для 3 разных приложений). Разве этого не должно быть достаточно? как я мог это проверить?

2. Предполагая, что загрузка процессора и памяти кажутся нормальными. Проверьте подключение к вашей очереди. В противном случае вы могли бы попробовать предварительную настройку, если у вас короткие задачи

3. сельдерей по умолчанию выполняет предварительную выборку

4. Я имел в виду, что вы можете увеличивать / уменьшать предварительную выборку в зависимости от ваших задач