我们在最开始学习编程的时候,我们的编程思维
就被迫
固定在了两个非常理想化的情境上,那就是:
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的新手,还是想从其他平台转过来的老手,都可以受益于本书。稍有不足的是,也许是编著的缘故,行文稍微有点杂,希望作者在下一版时能够有所改进。
分享到:
相关推荐
Node.js 应用程序是用 JavaScript 编写的,可以在 Mac OS X、Windows 和 Linux 上的 Node.js 运行时中运行而无需更改。 Node.js 应用程序旨在最大限度地提高吞吐量和效率,使用非阻塞 I/O 和异步事件。Node.js 应用...
Node.js 应用程序是用 JavaScript 编写的,可以在 Mac OS X、Windows 和 Linux 上的 Node.js 运行时中运行而无需更改。 Node.js 应用程序旨在最大限度地提高吞吐量和效率,使用非阻塞 I/O 和异步事件。Node.js 应用...
Node.js 应用程序是用 JavaScript 编写的,可以在 Mac OS X、Windows 和 Linux 上的 Node.js 运行时中运行而无需更改。 Node.js 应用程序旨在最大限度地提高吞吐量和效率,使用非阻塞 I/O 和异步事件。Node.js 应用...
Node.js 应用程序是用 JavaScript 编写的,可以在 Mac OS X、Windows 和 Linux 上的 Node.js 运行时中运行而无需更改。 Node.js 应用程序旨在最大限度地提高吞吐量和效率,使用非阻塞 I/O 和异步事件。Node.js 应用...
Node.js发布于2009年5月,由Ryan Dahl开发,是一个基于Chrome V8引擎的JavaScript运行环境,使用了一个事件驱动、非阻塞式I/O模型, [1] 让JavaScript 运行在服务端的开发平台,它让JavaScript成为与PHP、Python、...
Node.js 编码风格指南
Node.js 应用程序是用 JavaScript 编写的,可以在 Mac OS X、Windows 和 Linux 上的 Node.js 运行时中运行而无需更改。 Node.js 应用程序旨在最大限度地提高吞吐量和效率,使用非阻塞 I/O 和异步事件。Node.js 应用...
iconv-lite - 纯javascript转换字符编码
rest.js - 用于JavaScript的GitHub REST API客户端
《Node.js 调试指南》是本人整理的从事 Node.js 开发这几年的一些调试经验和思路,希望授人以鱼也能授人以渔。
TensorFlow Node.js 为Node.js用户提供惯用的JavaScript语言绑定和高层API
Node.js是一个javascript运行环境。它让javascript可以开发后端程序,实现几乎其他后端语言实现的所有功能,可以与PHP、Java、Python、.NET、Ruby等后端语言平起平坐。node-v14.18.1-x64.msi,node.js已集成npm,...
第5章 使用Node.js进行Web开发 79 5.1 准备工作 80 5.1.1 使用http模块 82 5.1.2 Express框架 83 5.2 快速开始 84 5.2.1 安装Express 84 5.2.2 建立工程 85 5.2.3 启动服务器 86 5.2.4 工程的结构...
Node.js 是一个开源与跨平台的 JavaScript 运行时环境。 它是一个可用于几乎任何项目的流行工具! Node.js 在浏览器外运行 V8 JavaScript 引擎(Google Chrome 的内核)。 这使 Node.js 表现得非常出色。 Node.js ...
使用Node.js创建Steam机器人和网站的一份指南
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时
Little Docter:是一个跨平台的XSS蠕虫JavaScript框架,可以漏出文件,麦克风、摄像头和其他数据。
Kefir.js - JavaScript的响应式编程库专注于高性能和低内存使用
一个用于自动获取支付宝账单信息的 Node.js 模块
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时