关于NodeJs的非阻塞的疑问

13-09-17 jhr820520
         

我们都知道在传统的WEB服务中,比如Apache , 请求发生时,服务器会专门的启动独立的线程来处理,以达到并行的效果。 这是由于每一个请求处理都可能会有IO的阻塞,如果让服务器的主线程来处理的话,它会由于阻塞而不能再接受新请求的处理。

但是采用这种方式, 当请求数过多时,服务器对应的线程也相应增加,服务器会不堪重负,并且线程的管理也是一件很麻烦的事情。

Node.js可以在不新增额外线程的情况下,依然可以对任务进行并行处理 —— Node.js是单线程的。它通过事件轮询(event loop)来实现并行操作,对此,我们应该要充分利用这一点 —— 尽可能的避免阻塞操作,取而代之,多使用非阻塞操作。

Node.js是单线程的,而又因为Node.js是事件驱动的,那么就是说用主线程来不停的轮询事件队列,当发现队列中有事件,就触发事件回调(事件消费者)来处理该事件,据我个人理解如下:

1、肯定不是由主线程来执行事件回调,因为这样仍旧会造成阻塞。

2、启动新的单独线程来执行回调,那么同样会造成开始所说的,线程过多,服务器压力大,而且也要管理大量线程的问题。

我想请教各位道友:

1、既然仍然会启动新的线程来执行回调,为什么会说Node.js是单线程的?

2、同样是启用多线程,只是启用的点不一样,传统方式:服务器在接受请求时,直接就会启用新线程来处理,而新的方式:采用事件队列接收事件(请求),主线程轮询,分发每一个事件让新线程来处理请求。两者的优劣是什么?

         

jhr820520
2013-09-17 14:04

自己顶一下,发现jdon现在除了banq老师外,很少人发帖回帖了。

banq
2013-09-17 14:36

2013-09-17 11:35 "@jhr820520

"的内容

事件队列接收事件(请求),主线程轮询,分发每一个事件让新线程来处理请求。两者的优劣是什么 ...

据我了解,Node.js是单线程的,也就是event loop轮询是单线程在轮询,一旦有数据,就调用你编写的业务方法,没有抛出新线程执行业务方法一说,这就要求你编写的业务方法不能堵塞CPU,好处是你无需考虑状态共享,事务等等,无需加锁。

参考来自:http://thatextramile.be/blog/2011/12/node-js-for-dummies/

jhr820520
2013-09-20 20:56

2013-09-17 14:36 "@banq

"的内容

也就是event loop轮询是单线程在轮询,一旦有数据,就调用你编写的业务方法,没有抛出新线程执行业务方法一说 ...

先祝banq老师及其他道友中秋快乐!

这两天中秋节,回了老家一趟,所以今天才看到回复。

banq老师您说:“没有抛出新线程执行业务方法一说”,那是不是Node.js不支持并发处理?单线程轮询到数据,调用业务方法,执行完后继续轮询?感觉有点不科学啊,呵呵。