快速学习nodejs系列:四、nodejs特性1--单线程

普罗旺斯的梦 2019-06-26

nodejs特性1--单线程

说明:也许你会问,为什么还不安装nodejs?还不写代码?还不讲模块?前面我说过,不会一来就hello world。而是会先跟大家讲讲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完成后才能进行下面的程序。

快速学习nodejs系列:四、nodejs特性1--单线程
图1

在Nodejs单线程中,首先会把所有要执行的线程放到“事件栈”中,在开始执行第一个线程后,遇到I/O时,会马上把当前的I/o操作放到事件栈中并开始执行线程2;当线程1的I/O执行完成后,程序会回到线程1,并执行线程1的程序2;当线程2中遇到I/O,也会放到事件栈中;程序转而去处理其他;就是这样的循环,让程序达到并行效果,这个线程的利用率是100%的。

快速学习nodejs系列:四、nodejs特性1--单线程
图2

如果你还不明白的话,我们可以用生活的例子来进一步说明:餐厅和服务员的关系;多线程--招很多个服务员,每个服务员干特定的活(点菜、冲茶、收桌子),干完自己的活后可以休息;而单线程--只招了一个服务员,所有的活都有他自己一个人干,干什么他自己决定,甚至点菜干到一半,去把冲茶干完后,再回来继续点菜也可以。

另外,单线程中,操作系统没有创建、销毁线程的时间开销。
单线程缺点:如果有用户造成线程崩溃,那个整个系统都崩溃了。(不过nodejs很难崩溃,会有相应的错误事件处理)

相关推荐