关于NodeJs的非阻塞的疑问
我们都知道在传统的WEB服务中,比如Apache , 请求发生时,服务器会专门的启动独立的线程来处理,以达到并行的效果。 这是由于每一个请求处理都可能会有IO的阻塞,如果让服务器的主线程来处理的话,它会由于阻塞而不能再接受新请求的处理。
但是采用这种方式, 当请求数过多时,服务器对应的线程也相应增加,服务器会不堪重负,并且线程的管理也是一件很麻烦的事情。
Node.js可以在不新增额外线程的情况下,依然可以对任务进行并行处理 —— Node.js是单线程的。它通过事件轮询(event loop)来实现并行操作,对此,我们应该要充分利用这一点 —— 尽可能的避免阻塞操作,取而代之,多使用非阻塞操作。
Node.js是单线程的,而又因为Node.js是事件驱动的,那么就是说用主线程来不停的轮询事件队列,当发现队列中有事件,就触发事件回调(事件消费者)来处理该事件,据我个人理解如下:
1、肯定不是由主线程来执行事件回调,因为这样仍旧会造成阻塞。
2、启动新的单独线程来执行回调,那么同样会造成开始所说的,线程过多,服务器压力大,而且也要管理大量线程的问题。
我想请教各位道友:
1、既然仍然会启动新的线程来执行回调,为什么会说Node.js是单线程的?
2、同样是启用多线程,只是启用的点不一样,传统方式:服务器在接受请求时,直接就会启用新线程来处理,而新的方式:采用事件队列接收事件(请求),主线程轮询,分发每一个事件让新线程来处理请求。两者的优劣是什么?