转自:http://allenny.iteye.com/blog/1632201
我们在最开始学习编程的时候,我们的编程思维 就被迫 固定在了两个非常理想化的情境上,那就是:
1.所有的I/O操作都几乎是在一瞬间完成的。
2.只有一个人需要运行你的程序(或者说每个程序只需要运行一次)。
正是基于这样的假设,我们才能顺利的搞定编程题目并从大学毕业,如果你的老师告诉你,在你对一大堆数字进行排序前你的程序需要花5分钟先从磁盘上把数据读出来,并且有2000多人同时十万火急的需要你的计算结果,你还会对未来从事的职业有信心吗?你确定不会辍学去卖煎饼吗?
现实与理想的最大不同,就是你还需要搞定那5分钟和2000多人的关系。你希望花掉大于2000*5=1W分钟(还没算上排序)的时间才能解决掉你的问题吗?显然不是,于是有人发明了线程。线程是个好东西,5分钟I/O时间我也许改变不了,但是我可以通过多线程来同时进行I/O读取和排序计算。可是,要是理想1是真的话,那我们只要写一个简单的循环,顺序的进行2000多次计算就可以了。
多线程也许不是最好的解决方案,特别是在非常高的并发计算的情况下,每个工作请求都会产生(占用)一个线程,每个线程都会占据系统资源,线程间共享内存的同步也会占用资源,线程越多,情况越严重。肿么办呢?Node.js就是来解决这些问题的,那么它是怎么实现的呢?它让所有的I/O操作都变成异步的!调用完I/O操作之后马上就返回继续执行。咦,听上去挺耳熟的,喔,它让我们的理想1变成了现实啦!哈,这样就不需要多线程了,我只要简单循环一下就OK了,因为等待没有了。当然,其实,理想1并不是真的实现了,I/O没有在瞬间完成,只是看上去像罢了,I/O还是照常进行,Node.js施了一个小小的“诡计”,它通过事件机制让每个排序计算在I/O完成之后得到通知并被执行。
不需要处理线程同步的世界真是美好,我都不知道自己曾经在调试Java线程上花掉了多少时间。Node.js在所有阻塞操作上都采用了异步方式:磁盘I/O,网络通信,数据库操作等。而因为异步方式不需要等待,我们写的处理程序都是在单一的线程中执行的,也就是说所有无阻塞的计算都组合在一起形成了密集的CPU计算,并发越多越能充分利用CPU,就像批处理程序一样。这不就是我们在上学的时候就“梦寐以求”的理想编程环境么?
当然,显而易见的我们也能看出来Node.js的缺点,那就是:1. 在并发请求不太高,以及本身就是CPU计算密集型的应用程序上,Node.js的优势很难发挥。2. 并非所有操作都是不需要等待的,Node.js把非阻塞应用到了极致,如果有需要阻塞的操作,那么Node.js处理起来就要难一些了。当然,每个工具都有它的优势和劣势,期待Node.js能够越来越成熟,适用性越来越广。
以上就是我读了《Node.js开发指南》一些章节,以及通过自己多年的编程经验得到的对Node.js的理解。此书用非常直接、易于理解的方式介绍了Node.js的基本知识,不管是刚入行想学Node.js的新手,还是想从其他平台转过来的老手,都可以受益于本书。稍有不足的是,也许是编著的缘故,行文稍微有点杂,希望作者在下一版时能够有所改进。