Предположим, у нас есть приложение для обмена мгновенными сообщениями, основанное на клиент-сервере, а не p2p. Фактический протокол не имеет значения, важна архитектура сервера. Указанный сервер может быть закодирован для работы в однопоточном, непараллельном режиме с использованием неблокирующих сокетов, которые по определению позволяют нам выполнять операции, такие как чтение-запись, эффективно сразу (или мгновенно). Эта особенность неблокирующих сокетов позволяет нам использовать какую-то функцию выбора/опроса в самом ядре сервера и тратить время от времени на фактические операции чтения/записи сокетов, а тратить время на обработку всей этой информации , Правильно закодированный, это может быть очень быстро, насколько я понимаю. Но есть второй подход, и это многопоточно, создавая новый поток (очевидно, используя какой-то пул потоков, поскольку эта операция может быть (очень) медленной на некоторых платформах и при некоторых обстоятельствах) и разрешать эти потоки работать параллельно, в то время как основной фоновый поток обрабатывает accept() и прочее. Я видел, как этот подход объяснялся в разных местах по Сети, поэтому он, очевидно, существует.Разработка сервера мгновенных сообщений
Теперь вопрос в том, что если у нас есть неблокирующие сокеты, а также немедленные операции чтения/записи и простой, легко закодированный дизайн, почему существует второй вариант? Какие проблемы мы пытаемся преодолеть с помощью второго проекта, то есть потоков? AFAIK они обычно используются для работы над медленными и, возможно, блокирующими операциями, но таких операций, похоже, там нет!
На самом деле, я имел в виду ТОЧНО, что 1: 1 клиент: дизайн отображения нитей. Гибридный дизайн, о котором вы говорили, имеет смысл, и я действительно знаком с ним. Не могли бы вы подробнее рассказать о дизайне 1: 1? – iksemyonov
Спасибо !!! Я могу добавить только «волокна Win32» здесь, нет? Это единственный легкий (как в действительно легком) API-интерфейсе, который я знаю. Но в целом, да, то, что вы говорите, имеет смысл. Как вы избегаете блокировки вызовов базы данных (это самая очевидная вещь, которая сразу приходит в голову в контексте этого обсуждения и, кроме того, потоков) в однопоточной модели? – iksemyonov
волокна могут быть легкими, но они не спасают вас, если вы хотите сделать блокирующий вызов. Избежать блокировки вызовов обычно практически невозможно, поэтому модель 1: 1 настолько распространена. Некоторые API БД предоставляют неблокирующие вызовы, а большинство нет. В последнем случае вы можете реализовать асинхронный шаблон и запланировать блокирующий вызов в потоке (пуле) и получить уведомление, когда оно будет завершено. Это означает, что вы наберете много клиентов на (меньше) потоков, обрабатывающих блокирующие вызовы, хорошо ли это работает, зависит от скорости блокировки вызовов и среднего времени, которое требуется каждому. – nos