#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. Я имел в виду, что вы можете увеличивать / уменьшать предварительную выборку в зависимости от ваших задач