Режим неблокирования Java NIO vs node.js асинхронный режим

Я не просмотрел детали кода node.js.

Но, пройдя некоторое исследование потока в node.js, я обнаружил, что у него есть единственный поток для приема соединения от нескольких клиентов.

При подключении к клиенту он запускает события подключения и прослушивает другого клиента и полностью работает в асинхронном стиле, а операция ожидания клиента запроса выполняется из пула потоков, и результат отправляется обратно в основной поток (поток, который принимает соединение) через обратный вызов.

Как и в Java NIO, ServerSocketChannel, SocketChannel можно установить в неблокирующем режиме, а с помощью селектора один поток может контролировать несколько каналов. Таким образом, используя NIO ServerSocketChannel, SocketChannel также из одного потока, соединение может управляться асинхронно для нескольких клиентов.

Итак, неблокирующий режим NIO и node.js асинхронный с одним потоком следует тому же шаблону для концепции одиночного потока? Как говорят, они выполняются на одном потоке.

Ответ 1

Асинхронность в целом и, в частности, NIO, не обязательно поддерживаются одним потоком, они могут поддерживаться несколькими потоками для повышения производительности. Однако многопоточность требует дополнительной синхронизации (не сложной, но точной). Поскольку javascript не имеет утилит синхронизации, Node.js должен использовать один поток. Java асинхронные фреймворки могут использовать несколько потоков.

отв

Почему Node.js однопоточный по дизайну? Из Понимание Node.js:

"So I don't have to worry about code accessing the same data
 structures at the same time?"

 You got it! That the entire beauty of JavaScripts
 single-threaded/event loop design!

Таким образом, наиболее вероятной причиной однопоточного дизайна является просьба программистов javascript, которые в массовом порядке не знакомы с концепциями синхронизации.

Ответ 2

Нет. Неблокирование означает, что операции не блокируются, и они сообщают вам, что они сделали. Асинхронный означает, что операции продолжаются параллельно и перезвоны, когда они заканчиваются. Это совершенно разные парадигмы программирования.