当前位置: 首页 > 后端技术 > Node.js

快速学习nodejs系列:4.Nodejs特性1--单线程

时间:2023-04-03 12:36:01 Node.js

nodejs特性1--单线程说明:也许你会问,为什么还不安装nodejs呢?还不写代码?不是在谈论模块吗?前面说过,helloworld不会你来了就来。相反,我会先告诉你nodejs的特点。只有了解和理解了nodejs的特性,在后面的模块学习中,才会有一种豁然开朗的感觉,才会明白nodejs为什么要这样设计;只看文档写代码效率更高;原理比代码层面更重要!在php、java语言中,每次客户端连接都会创建一个新的线程。以php(php-fpm,单进程单线程)为例,每个php-fpm工作线程消耗内存约20M,一个8G的服务器同时支持约400个客户端连接。要支持更多的客户端连接,增加服务器数量的唯一方法就是增加硬件成本。nodejs中始终只有一个线程,它不会为每个客户端连接打开一个新线程。根据一些测试,一台8G内存的服务器同时支持4万个连接。Nodejs通过自身内部的事件机制和异步I/O从宏观上实现了并行。例子:比如一个任务有3个线程;在多线程中(图1),它的3个线程是同时并行的,但是由于每个线程都有I/O操作,所以必须等待阻塞I/O完成后才能进行后面的流程。图1在Nodejs单线程中,首先会将所有要执行的线程放入“事件栈”。开始执行第一个线程后,遇到I/O时,会立即将当前I/O操作放到事件栈中,开始执行线程2;当线程1的I/O执行完成后,程序会回到线程1,执行线程1的程序2;当线程2遇到I/O时,也会放入事件栈中;程序转而处理其他事情;正是这样一个循环,让程序达到了并行的效果,这个线程的利用率是100%。图2如果还是不明白,我们可以用生活中的例子进一步说明:餐厅和服务员的关系;),完成自己的工作就可以休息了;而单线程——只招了一个服务员,所有的工作都是他自己做的,他决定做什么,甚至点菜到一半,泡茶完了,可以回来继续点菜。另外,在单线程中,操作系统没有创建和销毁线程的时间开销。单线程的缺点:如果一个用户导致一个线程崩溃,整个系统就会崩溃。(不过nodejs很难崩溃,会有相应的错误事件处理)