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