Nginx использует epoll или другие методы мультиплексирования (выбор) для обработки нескольких клиентов, то есть он не создает новый поток для каждого запроса, в отличие от apache.
Я попытался воспроизвести то же самое в своей собственной тестовой программе, используя select. Я мог бы принимать соединения от нескольких клиентов, создав неблокирующий сокет и используя select, чтобы решить, какой клиент обслуживать. Моя программа просто возвращает им свои данные. Она отлично работает для передачи небольших данных (несколько байтов на клиента).
Проблема возникает, когда мне нужно отправить большой файл по соединению с клиентом. Поскольку у меня есть только один поток для обслуживания всех клиентов до тех пор, пока я не закончу чтение файла и запись его в сокет, я не могу возобновить обслуживание другого клиента.
Есть ли известное решение этой проблемы, или лучше создавать поток для каждого такого запроса?