Какую рабочую валюту я должен иметь для задач, связанных с вводом-выводом, в Сельдерее?

#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, который довольно похож, но не то же самое.