node.js 的代码细节我还没看完。
但是,通过对 Node.js 中线程的一些研究,我发现它只有一个线程来接受来自多个客户端的连接。
当与客户端连接时,它会触发连接事件并监听另一个客户端并以异步方式完全工作,客户端请求的其余操作从线程池执行,结果通过回调发送回主线程(接受连接的线程)。
与 Java NIO 一样,ServerSocketChannel、SocketChannel 也可以设置为非阻塞模式,并且使用选择器单线程可以监控多个 channel 。因此,使用 NIO ServerSocketChannel、SocketChannel 也可以从单线程中异步管理多个客户端的连接
那么,NIO 的非阻塞模式和 node.js 单线程异步是否遵循单线程概念的相同模式?正如两者所说,它们在单线程上执行。
最佳答案
一般的异步,尤其是 NIO,不一定由单线程支持,它们可以由多线程支持以提高性能。但是,多线程需要额外的同步(不复杂,但准确)。由于 javascript 缺少同步工具,Node.js 必须使用单线程。 Java 异步框架可以使用多个线程。
附录
为什么 Node.js 在设计上是单线程的?来自 Understanding Node.js :
"So I don't have to worry about code accessing the same data structures at the same time?"
You got it! That's the entire beauty of JavaScripts single-threaded/event loop design!
因此,单线程设计最可能的原因是为了取悦那些不熟悉同步概念的 javascript 程序员。
关于Java NIO 非阻塞模式 vs node.js 异步操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20740961/