Java NIO 非阻塞模式与节点.js异步操作

我还没有浏览node的代码细节.js。

但是,通过对Node.js中的线程进行一些研究,我发现它具有单个线程来接受来自多个客户端的连接。

当与客户端连接时,它触发连接事件并侦听另一个客户端,并以异步方式完全工作,客户端请求的休息操作从线程池执行,结果通过回调发送回主线程(接受连接的线程)。

与Java NIO中的明智一样,ServerSocketChannel,SocketChannel可以设置为非阻塞模式,并且使用选择器单线程可以监视多个通道。因此,使用NIO ServerSocketChannel,SocketChannel也可以从单线程的连接异步管理多个客户端

那么,NIO的非阻塞模式和节点.js异步与单线程是否遵循与单线程概念相同的模式?正如两者都说的那样,它们在单个线程上执行。


答案 1

一般来说,异步,特别是NIO,不一定由单线程支持,它们可以由多个线程支持以提高性能。但是,多线程需要额外的同步(不复杂,但准确)。由于javascript缺乏同步实用程序,Node.js必须使用单线程。Java 异步框架可以使用多个线程。

阿彭迪斯

为什么 Node.js设计是单线程的?从了解节点.js

“所以我不必担心代码同时访问相同的数据结构?”

没问题!这就是JavaScript单线程/事件循环设计的全部美妙之处!

因此,单线程设计最可能的原因是取悦javascript程序员,他们通常不熟悉同步概念。


答案 2

哈哈非阻塞意味着操作不会阻塞,并且它们会告诉您它们做了什么。异步意味着它们并行继续,并在完成时回电。它们是完全不同的编程范例。


推荐