Рабочие Гуникорн и Нитки

Что касается Gunicorn, я знаю, что существуют различные классы рабочих, но для этого разговора я просто смотрю на типы синхронизации и асинхронности.

Из моего понимания...

sync
workers = (2 * cpu) + 1
worker_class = sync

async (gevent)
workers = 1
worker_class = gevent
worker_connections = a value (lets say 2000)

Таким образом (на основе четырехъядерной системы), использующих синхронизаторов, я могу параллельно обрабатывать не более 9 соединений. С Async я могу иметь до 2000, с оговорками, которые поставляются с асинхронным.

Вопросов

  • Итак, куда впишется нить? Могу ли я добавлять потоки к типам рабочих процессов sync и async?
  • Каков наилучший вариант вокруг рабочих-стрелков? Должен ли я захотеть разместить стрельбу перед API Django, с требованием параллельно обрабатывать 100 запросов?
  • Безопасны ли классы gevent и sync worker?

Ответ 1

Позвольте мне попытаться ответить. Предположим, что в начале моего развертывания был только один рабочий-десантник. Это позволяет мне обрабатывать только один запрос за раз. Моя рабочая работа - это просто позвонить на google.com и получить результаты поиска для запроса. Теперь я хочу увеличить свою пропускную способность. У меня есть следующие варианты

Держите только одного работника и увеличивайте количество потоков в этом рабочем

Это самый простой. Поскольку потоки более легкие (меньше потребления памяти), чем процессы, я сохраняю только одного рабочего и добавляю к нему несколько потоков. Gunicorn гарантирует, что мастер может отправить несколько запросов работнику. Поскольку рабочий многопоточен, он способен обрабатывать 4 запроса. Фантастика. Теперь почему мне нужно больше рабочих?

Чтобы ответить на этот вопрос, предположим, что мне нужно выполнить некоторую работу над результатами поиска, которые возвратили google. Например, я мог бы также вычислить простое число для каждого запроса результата. Теперь я делаю оценку рабочей нагрузки, и я попал в проблему с блокировкой глобального интерпретатора python. Несмотря на то, что у меня есть 4 потока, только один поток может обрабатывать результаты за раз. Это означает, что для достижения истинной параллельной производительности мне нужно больше, чем один рабочий.

Увеличение числа рабочих, но все работники однопоточные

Так зачем мне это нужно, когда мне нужно получить истинную параллельную обработку. Каждый работник может одновременно совершать звонки на google.com, получать результаты и выполнять любую обработку. Все параллельно. Фантастика. Но недостатком является то, что процессы становятся более тяжелыми, и моя система может не справиться с требованиями увеличения числа рабочих для достижения параллелизма. Поэтому лучшим решением является увеличение числа работников, а также добавление новых потоков для каждого рабочего.

Увеличение числа рабочих и каждого работника многопоточно

Думаю, это не нуждается в дальнейших объяснениях.

Изменить тип работника на Async

Теперь, почему я хотел бы это сделать? Чтобы ответить, помните, что даже потоки потребляют память. Есть сопрограммы (радикальная конструкция, которую вы можете найти), реализованная библиотекой gevent, которая позволяет вам получать потоки без необходимости создавать потоки. Итак, если вы создаете свой пулемет, чтобы использовать рабочий тип gevent, вы получаете выгоду от НЕ того, чтобы создавать потоки у ваших работников. Предположим, что вы получаете темы без необходимости их явного создания.

Итак, чтобы ответить на ваш вопрос, если вы используете worker_type ничего, кроме Sync, вам не нужно увеличивать количество потоков в конфигурации вашего пушки. Вы можете сделать это, во что бы то ни стало, но это как бы побеждает цель.

Надеюсь, это помогло.

Я также попытаюсь ответить на конкретные вопросы.

  • Нет, опция threaded отсутствует для рабочего класса Async. Это необходимо сделать более ясным в документации. Интересно, почему этого не произошло.

  • Это вопрос, который требует больше знаний о вашем конкретном приложении. Если обработка этих 100s параллельных запросов просто включает операции ввода-вывода, такие как извлечение из БД, сохранение, сбор данных из какого-либо другого приложения, тогда вы можете использовать работника с потоком. Но если это не так, и вы хотите выполнить на центральном процессоре, потому что задачи чрезвычайно связаны с вычислением, возможно, как вычисления простых чисел, вам нужно использовать сотрудника Sync. Причины для Async несколько отличаются. Чтобы использовать Async, вы должны быть уверены, что ваша обработка не вычисляется, это означает, что вы не сможете использовать несколько ядер. Преимущество, которое вы получаете, состоит в том, что памяти, которую будет использовать несколько потоков, не будет. Но у вас есть другие проблемы, такие как не-обезьянные исправленные библиотеки. Перейдите в Async, только если работник с резьбой не соответствует вашим требованиям.

  • Sync, non threaded workers - лучший вариант, если вы хотите абсолютную безопасность потоков среди своих библиотек.