Как веб-сервер python преодолевает GIL

Любой веб-сервер, возможно, придется обрабатывать множество запросов одновременно. Как интерпретатор python фактически имеет ограничение GIL, как реализовано concurrency?

Используют ли они несколько процессов и используют IPC для совместного использования общего доступа?

Ответ 1

Как обычно. Веб-обслуживание в основном связано с I/O-интерфейсом, а GIL освобождается во время операций ввода-вывода. Таким образом, либо потоковая передача используется без каких-либо специальных приспособлений, либо используется цикл событий (например, Twisted).

Ответ 2

Обычно у вас много рабочих (т.е. gunicorn), каждый из которых отправляется с независимыми запросами. Все остальное (concurrency связанное) обрабатывается базой данных, поэтому оно абстрагируется от вас.

Вам не нужен IPC, вам просто нужен "единственный источник правды", который будет RDBMS, сервером кеша (redis, memcached) и т.д.

Ответ 3

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

Реализация этой концепции concurrency зависит от веб-сервера.

Некоторые реализации могут иметь фиксированное количество потоков или процессов для обработки запросов. Если все используются, дополнительные запросы должны дождаться обработки.

Другая возможность заключается в том, что процесс или поток генерируется для каждого запроса. Истечение процесса для каждого запроса приводит к абсурдной памяти и накладным расходам процессора. Нерест легкие нити лучше. Таким образом, вы можете обслуживать сотни клиентов в секунду. Однако также потоки приносят свои издержки управления, проявляя себя в высокой памяти и потреблении ЦП.

Для обслуживания тысяч клиентов в секунду архитектура, основанная на событиях, основанная на асинхронных сопрограммах, является самым современным решением. Это позволяет серверу обслуживать клиентов с высокой скоростью, не создавая нити нитей. На странице страницы Википедии о так называемой проблеме C10k вы найдете список веб-серверов. Среди них многие используют эту архитектуру.

Coroutines также доступны для Python. Посмотрите http://www.gevent.org/. Вот почему приложение Python WSGI на основе, например, uWSGI + gevent - чрезвычайно эффективное решение.