Показанные выше программы клиента и сервера echo иллюстрируют основы использования сокетов. Но реализация сервера страдает довольно существенным недостатком. Как описывалось выше, если соединиться с сервером попытаются сразу несколько клиентов и обработка запроса каждого клиента занимает длительное время, то происходит отказ сервера. Более точно, если трудоемкость обработки данного запроса не позволит серверу вовремя вернуться в цикл, проверяющий наличие новых запросов от клиентов, сервер не сможет удовлетворить все запросы и некоторым клиентам будет отказано в соединении.
В реальных программах клиент/сервер сервер чаще реализуется так, чтобы избежать блокировки новых запросов во время обработки текущего запроса клиента. Вероятно, проще всего достичь этого путем параллельной обработки всех запросов клиентов — в новом процессе, новом потоке выполнения или путем переключения (мультиплексирования) между клиентами вручную в цикле событий. Эта проблема не связана с сокетами как таковыми, и мы уже научились запускать процессы и потоки в главе 5. Но так как эти схемы реализации типичны для серверов, работающих с сокетами, рассмотрим здесь все три способа параллельной обработки запросов клиентов.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011