关于Node.js的单线程

        好了,开始讲Node.js了,什么是Node.js呢?

        它不是一种新的语言,它是基于googleV8引擎的javascript运行环境,特点:单线程、事件驱动、非阻塞、异步I/O……

        其实一开始的时候理解它的单线程问题还是有点困扰的,虽然不影响应用,但是还是要去理解它,在这里先说一些概念。

        先说一下进程和线程:

        进程,就是具有一个独立功能的程序的一次运行活动,说得直白点,就是一个运行的程序,你打开任务管理器就可以看到很多个进程了,而通常一个进程里面又包含若干个线程,它们都可以共享利用进程的资源,是独立运行和调度的基本单位。

        类比一下,进程就是一个正在生产的大车间,而线程就是里面的一条条生产线,都可以共享车间里面的资源。

        再说一下多线程,多线程就是多个线程并发执行,想象一个,你的生产线是一条接着一条去运行还是很多条生产线一起运行高效呢?答案可想而知。

        但是多线程有缺点,就是如果多条生产线使用独立性的公共资源就会使运行速度变慢,就等于要排队拿饭,饭点只有一个吗,轮流来。而且有可能造成线程的死锁,例如两个人要走这条路,一个人说,你让开我就能走了,另一个人也是这样想的,那大家都在等了,不用走了。

        但是对于单核CPU来说,它的多线程实际不是同一时间上运行多个线程,它同一时间只能做一件事情,就是只能运行一个线程,至于我们可以做到多线程并发,是由于CPU在不同的线程之间快速切换,以达到类似同时执行的效果,所以多线程并发不是并行的概念(不能同一时间同时执行)。

        如果问这样的多线程有什么意义,其实可以很好地解决阻塞问题,例如你要烧开水泡茶,如果是单线程的话,那么你要先等开水烧开,才能继续去准备茶杯和茶叶;如果是多线程,那么你在烧开水的时候,就可以转去准备茶杯和茶叶了,不用干等了。

        但是,并不是线程越多就越好的,因为线程之间的切换需要开销的,如果你的线程太多,CPU在线程切换的花销就太大了,你想象一下,我这个还没做完,那我就先记住做到哪里,然后做另一个,而做另外一个之前,又要先看看做到哪里了和要准备什么,这个切换太多的话,代价就显现了。

        好了,转回来说Node.js的单线程了。

        其实,Node.js实际上不是单线程的,那为什么说它是单线程,因为我们的js代码确实是处于单线程中执行的,但是如果需要调用到异步函数,例如I/O的话,它就会交由线程池的其他线程去执行,js代码会不等它的结果,跳过继续执行代码,然后最后才回头,通过轮询机制,执行回调之后的代码,但是即使多个回调,也只能排队,一个一个执行。

        举个例子,一个老太爷在做事,他只能一个事情接一个事情去做,然后遇到一件麻烦事,要叫张三还钱了,然后他叫管家去追债,然后自己继续办事,到最后搞定了。大声叫一下管家(可能管家已经追完钱回来在旁边等了),老太爷问他搞定没啊,如果管家说搞定了,老太爷就可以将钱放进钱柜里了,如果管家说搞不定啊,老太爷可能就会打他一顿了。

        当然了,基于它的单线程,Node.js是适合I/O密集型的程序,不适合计算密集型的程序,因为如果你叫老太爷计算一个东西,他一直算啊算,那其他要算的怎么办,不就在老太爷卡住了吗?I/O密集型就不一样了,老太爷没什么数要算,有麻烦事就交给下人去搞定就行了,多几个麻烦事也不怕,有的是下人,大不了他们干完回来一个接着一个汇报情况而已。

        关于Node.js的单线程,大概就是说的这样吧。

 

文章在我的github上的地址:点击跳转

原创文章,转载请注明出处!

知识共享许可协议
本文章采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行许可。

发表评论

电子邮件地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据