当前位置: 首页 > 面试题库 >

为什么Node.js是单线程的?

汪甫
2023-03-14
问题内容

在基于PHP(或Java / ASP.NET /
Ruby)的Web服务器中,每个客户端请求都在新线程上实例化。但是在Node.js中,所有客户端都在同一线程上运行(它们甚至可以共享相同的变量!)我知道I
/ O操作是基于事件的,因此它们不会阻塞主线程循环。

我不明白为什么Node的作者选择了它为单线程?这使事情变得困难。例如,我无法运行CPU密集型功能,因为它阻塞了主线程(并且阻塞了新的客户端请求),因此我需要产生一个进程(这意味着我需要创建一个单独的JavaScript文件并在其上执行另一个节点进程)它)。但是,在PHP
cpu中,密集型任务不会阻止其他客户端,因为正如我提到的那样,每个客户端都在不同的线程上。与多线程Web服务器相比,它有什么优势?

注意:我已经使用集群解决了这个问题,但这并不是很漂亮。


问题答案:

Node.js是作为异步处理中的实验而显式创建的。从理论上讲,在典型的Web负载下,与典型的基于线程的实现相比,在单个线程上执行异步处理可以提供更高的性能和可伸缩性。

你知道吗?我认为理论已经被证实。与Apache或IIS或其他基于线程的服务器相比,不占用大量CPU资源的node.js应用程序可以运行数千个并发连接。

单线程异步性质的确使事情变得复杂。但是,老实说,您认为它比线程处理还要复杂吗?一种比赛条件可能会破坏您的整个月!或者由于某个地方的某些设置而清空线程池,并观察响应时间变慢以进行爬网!更不用说死锁,优先级倒置以及与多线程相关的所有其他回旋。

最后,我不认为它普遍好坏。这是不同的,有时更好,有时却没有。使用正确的工具完成工作。



 类似资料:
  • 代码更清晰,处理逻辑更简单; 不用考虑各种锁的问题,不存在加锁和释放锁的操作,没有因为可能出现死锁而导致的性能问题; 不存在多线程切换而消耗CPU; 无法发挥多核CPU的优势,但可以采用多开几个Redis实例来完善;

  • 本文向大家介绍Redis 为什么是单线程的?相关面试题,主要包含被问及Redis 为什么是单线程的?时的应答技巧和注意事项,需要的朋友参考一下 因为 cpu 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存或者网络带宽。既然单线程容易实现,而且 cpu 又不会成为瓶颈,那就顺理成章地采用单线程的方案了。 关于 Redis 的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。而且

  • 本文向大家介绍请问,redis为什么是单线程?相关面试题,主要包含被问及请问,redis为什么是单线程?时的应答技巧和注意事项,需要的朋友参考一下 考察点: 因为CPU不是Redis的瓶颈。Redis的瓶颈最有可能是机器内存或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。缺点:服务器其他核闲置。

  • 本文向大家介绍NodeJs是基于单线程的吗?为什么?相关面试题,主要包含被问及NodeJs是基于单线程的吗?为什么?时的应答技巧和注意事项,需要的朋友参考一下 js 本身就是 single thread,NodeJS 发明者将 Chorme v8 vm 引擎 runtime 加上 async io 使得效能得以突出,所以 NodeJS 的发明者完成 libuv 就离开 NodeJS 了。

  • 本文向大家介绍请为什么说js是单线程,而不是多线程呢?相关面试题,主要包含被问及请为什么说js是单线程,而不是多线程呢?时的应答技巧和注意事项,需要的朋友参考一下 JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊。 JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript

  • 我正在通过quartz调度程序调用spring批处理作业,它应该每1分钟运行一次。当作业第一次运行时,成功打开ItemReader并运行作业。但是,当作业尝试第二次运行时,它使用的是第一次运行的相同实例,该实例已经初始化,并接收“java.lang.IllegalStateException:Stream is eignitialized.Close before re-opening”。我已经将