浅谈node.js

node.js接触也有不短时间了,起初一直很纳闷,它既然是单进程单线程的,意味着所有的用户访问都只能是一个队列化串行的处理过程。只能由唯一进程去处理。相比PHP通过web服务器开启多线程处理每一个对应的请求来说,看不出它的优势。

细看了相关资料,感觉这个应该是传播描述上刻意放大了单进程单线程。这个单进程单线程只是用来说明node.js对用户等请求的处理是通过单进程单线程去处理的。node.js这个软件的自身并不是单进程单线程的。它内部其实有一个线程池。用来处理各种基本的I/O操作,这个线程池就是一个多线程的执行。每个线程去处理单个的任务, 实现了并行的执行。

简单解释node.js整个原理。就类似一个中型饭店。顾客->单个服务员->厨房. node.js 实现的是单个服务员到厨房这个处理过程。 我们日常编程处理的就是顾客申请服务员服务的过程。所有的 顾客来点菜都是通过这一个服务员去下单。而服务员自己将要做的菜分发给厨房。由厨房里的几个厨师去做。服务员仅仅去记录哪个顾客点了哪个菜。菜做好后便根据记录将菜端给顾客。

node.js实现这个过程中主要还依赖了javascript的事件响应机制,才共同实现了异步编程。node.js将所有请求交由单个进程单线程去处理。而它内部自身线程池却有多个厨师去做菜。每个厨师按照菜单依次去做,每个厨师做完一道菜就会通知服务员菜已做好,而这个服务员再将菜端给指定的顾客。这个过程等厨师通知服务员菜做好,服务员员才去端的过程就是事件响应机制。还有另一种办法就是服务员一直去查看厨师做好了什么菜,然后端上来,这种就不交事件响应,类似事件轮询了。厨师通知完接着去剩余菜单里选择下一道菜。这样结果就是javascript这个服务员只是做了简单的下单,端菜就可以应对所有的顾客请求。由于多个厨师去做菜,而且这些菜嘛有复杂的有简单的,菜简单的就会很快做完然后这个厨师又做了一道简单的菜。就会导致后点的某个简单菜的顾客会先上菜。先到的顾客不一定先上菜。这个单进程单线程的服务员由于近处理菜单和端菜简单的操作,可以发挥出很高的效率。当然这个要是人特别多的话也会手忙脚乱的。

PHP在这方面就类似另一种vip星级服务的饭店。顾客进来都会由专门的服务员去接待。而这个服务员同一时间只能去接待这个或这桌顾客,比如客人点了菜,服务员就一直去等厨师去做。这之间服务员却不能接待其它顾客。直到菜做好,顾客吃完结账后才能去接待另一个/桌顾客。这样每桌专人负责呢。就会使服务员在不少时间内处于等待时间,可又什么不能做。造成资源浪费。顾客少的时候还可以。顾客多的情况,服务员就不够了,就得等待。

PHP这种其实大部分的时候服务员是处于等待状态,这些等待状态时间明显大于服务的时间。而node.js这种则充分利用了服务员,虽然只有一个去忙碌处理,但是做的事情呢基本会多于PHP这种,毕竟现有的情形都是等待时间远远大于服务时间的情形。

说到这里Node.js缺点也看出来了,只有一个人,要是服务某个客户时间远大于等待时间时。会拖累整体进度,这种情形就比如计算的等领域。服务员需要手工去计算某一大桌子菜单。这时候就会影响其他顾客。PHP在这方面则只会是对应的那个服务生去忙吧

PHP这种招募多个服务生就需要付出多份薪水。开销呢就增加不少。node.js也许单个服务员薪资很高吧,但在现有情况下。计算机资源有限的情况,应该比PHP效率高些。不过开发难度呢也就提升了。开发效率与运行效率的权衡吧。

node.js因为它的这种事件响应,内部线程池的模型,才实现了一个版本异步调用。这个单进程,单线程呢,也是主要原因。毕竟这种实现方式简单,占用资源也较小吧。

One thought on “浅谈node.js”

  • 从松松博客过来的,贵站做的真心不错,我和大学同学也刚做了一个网站,欢迎站长朋友过来看看,能给我提点建议的话就感激不尽了,我的网站是恋字坊http://www.lianzifang.com/

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>