Я хочу написать серверную программу, которая принимает входящие соединения и обрабатывает полученные запросы. Первая идея появилась у меня в голове - использовать неблокирующий сокет с epoll()
или select()
.Эффективность асинхронного неблокирующего серверного сокета
Например, когда возвращается epoll()
, он дает мне массив сокетов с доступными событиями ввода-вывода. Затем мне нужно перебрать массив сокетов для отправки и получения данных, как только буфер будет полностью получен или отправлен, выполняются функции обратного вызова. Это также техника, наиболее обсуждаемая в Интернете.
Однако, если я использую эту технику, моя программа будет поддерживать все остальные сокеты, ожидая, когда она будет иметь дело с одним клиентским соединением. Разве это неэффективный способ пойти, если запрос клиента занимает много времени?
В документах, которые я нашел, что они сказали, что дизайн таких один поток/процесс может легко обрабатывать сотни соединений одновременно, и дизайн многопоточный всегда сильно критиковали за его сложности, системы накладных расходов и т.д.
Таким образом, , мой вопрос: Как создать эффективную серверную программу, если она должна обрабатывать тяжелую рабочую нагрузку?
Спасибо.
Waaaay для широкого. – SergeyA
@SergeyA Я не переделал, что это была такая широкая тема. Но я думаю, что у меня уже есть мой ответ, и хорошая статья для чтения. Спасибо. – vesontio