Программирование сервера Python

задняя часть Python сервер API

В списке языков программирования 2017 года, опубликованном IEEE, python занимает первое место. В индексе Baidu объем поиска python также достиг порядка величины, равной объему поиска java, что делает его одним из самых популярных языков.

Так подходит ли Python для серверного программирования?

Во-первых, посмотрите, какие компании используют Python в качестве основного стека технологий для серверов? Видно, что нет недостатка в компаниях с большим количеством пользователей.

Благодаря простоте языка Python очень подходит для быстрой разработки и написания читаемых программ. Итак, как использовать python для серверного программирования?

Начиная с примера...

Это простой эхо-сервер, сервер каждый раз считывает несколько байтов из запроса и возвращает их клиенту.

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

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

Однако, если модель с несколькими процессами не обрабатывается должным образом, появятся процессы-зомби и процессы-сироты, поэтому родительский процесс должен обрабатывать сигнал SIGCHILD для сбора информации о завершившемся дочернем процессе.

Пример сбора подпроцессов ForkingMixIn в модуле socketserver:

Исходная программа CGI использует этот метод, разветвляя процесс для каждого запроса на интерпретацию программы cgi.

Однако по мере увеличения количества запросов накладные расходы, вызванные процессом ветвления, часто становятся большими.

Так что CGI не только медленный...

и

четное

Позднее появился FastCGI, отличие которого от CGI в том, что он более Fast (ошибочно), это резидентный процесс, который заранее запускает несколько cgi-процессов для ожидания обработки запросов.

В отличие от FastCGI, Apache имеет модуль mod_python, который позволяет встроить интерпретатор Python в процесс Apache.

Позже WSGI был определен в PEP 333 и стал стандартным протоколом для веб-разработки Python, который используется до сих пор.

Пример применения протокола WSGI:

Большинство фреймворков веб-разработки на Python соответствуют этому стандарту:

gunicorn — известный http-сервер wsgi, который использует модель pre-fork для обработки и пересылки запросов.

gunicorn включает множество рабочих моделей:

Помимо многопроцессорности, давайте рассмотрим многопоточную модель, которая использует поток вместо процесса для обработки каждого запроса:

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

Что, черт возьми, здесь происходит?

Речь идет о GIL в python.Из-за ограничений GIL многопоточности сложно полностью использовать производительность процессора (Ссылка на исходное изображение)

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

Модель актера

производитель-потребитель

concurrent.future определен в PEP 3148, который предоставляет более простой многопроцессорный/многопоточный API.

Долгое время модель многопроцессорности/многопоточности работала хорошо, но

В это время начинает широко использоваться более подходящая для серверного программирования модель мультиплексирования ввода-вывода:

Очевидно, что эффективное использование ресурсов сервера на основе асинхронной модели, управляемой событиями, очевидно.

Было получено большое количество асинхронных сетевых фреймворков.

После Python 3.4 появилась стандартная библиотека asyncio, предназначенная для обработки асинхронного ввода-вывода.

А после Python 3.5 появился синтаксис сопрограммы «сахар async/await».

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

В общем, серверное программирование поначалу превратилось из простого в более сложное и, в конце концов, превратилось в простоту.