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