#multithreading #concurrency #celery
Вопрос:
У меня есть пара задач, которые обрабатывают запросы API. На самом деле ответ API может занять довольно много времени. 5-10 секунд — это не редкость.
Как мне решить, какое значение является разумным worker_concurrency
для задач, связанных с вводом-выводом?
В документах просто указано:
Количество одновременных рабочих процессов / потоков / зеленых потоков, выполняющих задачи.
Если вы выполняете в основном операции ввода-вывода, у вас может быть больше процессов, но если они в основном связаны с процессором, постарайтесь, чтобы он был близок к количеству процессоров на вашем компьютере. Если не задано, будет использоваться количество процессоров / ядер на хосте.
Что произойдет, если я выберу это число слишком высоким? Концептуально, я бы ожидал, что затем ОС будет так часто переключаться между потоками, что (в какой-то момент) само переключение потоков станет высокой нагрузкой на процессор. Или есть что-то еще?
Читая это, я думаю, что мне следует использовать eventlet для задач, связанных с вводом-выводом:
сельдерей -рабочий проект -P eventlet —concurreny= 500
Совпадает worker_concurrency
с --concurrency
флагом?
Ответ №1:
Я наткнулся на ту же проблему. Итак, как вы прочитали в этом сообщении в блоге, параллелизм в этой ситуации означает количество Greenlets
или green threads
. Таким образом, переключение между ними — это не то же самое, что переключение между threads
ними, потому что каждый из green threads
«добровольно или явно передайте управление друг другу в указанных точках вашего кода».
И
«Гринлеты управляются в пространстве приложения, а не в пространстве ядра».
Как указано в сообщении в блоге, которое вы прочитали.
С другой стороны, переключение между потоками выполняется task scheduler
базовой ОС. Итак, имея это в виду, это не тот вопрос, на который можно ответить, указав вам число.
Мне кажется, что количество green threads
, которое вы используете, должно быть протестировано для вашего сценария и машины, на которой выполняется ваша задача сельдерея, чтобы получить наилучшую производительность. Возможно, начните с 25, затем 100, 500, 1000 и так далее, Чтобы получить представление о том, сколько времени требуется вашей программе для полного выполнения.
Кроме того, вы можете протестировать производительность своей программы не только с помощью пула eventlet, но и с помощью пула gevent, который довольно похож, но не то же самое.