весь пул потоков http-сервера заблокирован recv

#sockets #server #httpserver

Вопрос:

Я сделал http-сервер. Раньше я создавал новый поток для каждого соединения. Теперь я использую пул потоков.

Моя проблема в том , что все мои потоки блокируются их вызовом recv , потому что я использую постоянные соединения. Поэтому, когда принимаются новые соединения, ни один из потоков не обрабатывает их.

Каково здесь решение? Каждый учебник, похоже, закрывает соединения вместо того, чтобы поддерживать их, что происходит очень медленно. Мое текущее решение состоит в том, чтобы иметь пул потоков примерно из 1000 потоков, что очень глупо.

Комментарии:

1. «Кажется, что каждый учебник закрывает связи, вместо того чтобы поддерживать их» да, верно:) Точно так же, как каждый пример select/epoll на этих сайтах является эхо-сервером (поэтому избегайте сохранения состояния при чтении:). Классический пул потоков не подходит для большого числа независимых задач ввода-вывода.

2. «выберите/epoll» — это концепция, о которой мне нужно знать, спасибо. не понимал, что могу совершать неблокирующие звонки на recv

3. У HTTP keep-alive должен быть тайм-аут, в конце концов он должен сдаться. После того, как вы отправите ответ для поддерживаемого соединения (вы отправляете Keep-Alive заголовок ответа , не так ли?), Затем подождите только до X раз, пока новый запрос поступит на это соединение. Если до истечения тайм-аута запрос не поступит, закройте соединение и верните поток в пул. Если появляется новое соединение и пул пуст, создайте новый поток или отклоните запрос с Busy ответом и закройте соединение.