`

为什么要有Node.js -- 读《Node.js开发指南》有感

阅读更多

我们在最开始学习编程的时候,我们的编程思维 就被迫 固定在了两个非常理想化的情境上,那就是:

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-MaterialDesignRevealEffect形式的Toolbar搜索控件

    "Node.js-MaterialDesignRevealEffect形式的Toolbar搜索控件"是一个专门为Android平台设计的组件,它结合了Material Design的风格和交互特性,特别是在Toolbar中的搜索功能上实现了"Reveal Effect"效果。这种效果...

    ketai-admin.zip

    这个项目名为 "ketai-admin",它是一个基于Vue.js框架开发的前端用户界面,专用于构建教育类网站的管理后台。Vue.js 是一种轻量级、高性能的前端JavaScript框架,以其易学易用、组件化开发和优秀的性能著称。 ...

    love-master.zip

    6. **技术栈选择**:虽然具体的技术细节未在描述中提及,但通常这类应用可能采用HTML5、CSS3、JavaScript(可能结合React Native或Flutter等框架)进行前端开发,后端可能涉及Node.js、Python或PHP等语言,以及...

    clans-welcomer:Ghiilain氏族的欢迎Discord机器人

    【标题】:“clans-welcomer: Ghiilain氏族的欢迎Discord机器人”是一个基于JavaScript开发的项目,其主要目标是为Ghiilain氏族在Discord平台上提供一个自动化的欢迎服务。Discord是一个流行的在线聊天和语音通信...

    网站开发设计流程图.pdf

    在整个开发过程中,需要编写详尽的“整体设计开发文档”,包括需求文档、设计规范、开发指南和用户手册,方便团队成员理解和协作,也为未来维护和升级提供依据。 10. **项目管理**: 在大型团队中,各个角色...

    视频直播.zip

    微信小程序虽然不是传统意义上的Web应用,但它在某种程度上与Web开发有共通之处。开发者应理解前端的MVVM框架原理,比如React或Vue,因为这些框架的思维方式可以借鉴到小程序开发中。同时,对HTML、CSS和JavaScript...

    图片裁剪插件适用于后台上传图片

    - `package.json`:这是Node.js项目的配置文件,包含了项目依赖、版本信息和脚本命令等。 - `README.md`:项目的基本介绍和使用指南,通常采用Markdown格式编写。 - `MIT-LICENSE.txt`:包含了MIT许可证的具体文本。...

    jQuery权威指南(pdf)及配套源代码

    《jQuery权威指南》是一本深度解析jQuery库的书籍,它为开发者提供了全面、深入的jQuery知识体系。jQuery作为一款广泛使用的JavaScript库,极大地简化了网页的DOM操作、事件处理、动画制作以及Ajax交互,是现代Web...

    standschedule:守护进程安排对站立式办公桌的习惯,在数周内缓慢增加站立时间

    Node.js 是一个开放源代码、跨平台的JavaScript运行环境,它允许开发者使用JavaScript来执行服务器端任务。因此,"standschedule" 使用JavaScript编写,意味着它可以借助Node.js在用户的计算机上运行。 ...

    so-you-want-a-website:帮助客户建立网站的指南

    他们可以支持 Node.js 吗?域名系统您的 DNS 在哪里控制?内容管理系统您有当前的内容管理系统吗? 你觉得它易于使用吗? 哪些领域难以管理? 您对 CMS 的使用感受如何? 您可以轻松上传图片、创建帖子、更新内容吗...

    掌上城市o2o城市门户系统掌上智慧城市本地生活服务衣食住行吃喝玩乐综合门户平台.txt

    2. **后端服务**:利用Node.js、Java、Python等语言搭建稳定可靠的后端服务器集群,处理复杂业务逻辑并提供API接口。 3. **数据库管理**:选用MySQL、MongoDB等关系型或非关系型数据库存储海量数据,保障数据一致性...

    语音直播社交APP源码多人连麦聊天双端APP源代码游戏陪练附编译说明.txt

    - **后端**:基于Node.js+Express搭建服务器端逻辑处理层。 - **数据库**:使用MongoDB作为非关系型数据库存储用户信息及聊天记录等数据。 - **实时通信**:集成WebSocket实现实时双向通信,确保低延迟高并发的语音...

    代码.zip

    此外,代码文件中可能包含项目配置文件,如.gitignore用于忽略版本控制系统中的特定文件,或者package.json在Node.js环境中记录项目依赖。还有可能包含Makefile用于自动化构建过程,或者webpack配置文件用于现代...

    软件设计大赛.zip

    对于Web应用,前端可能涉及HTML、CSS和JavaScript,后端可能涉及Node.js、Spring Boot等框架。 5. **数据库设计与管理**:许多软件系统需要存储和处理大量数据,因此数据库设计和管理技能不可或缺。这包括了解SQL...

    trevor-bot:Trevor是我在微服务架构下使用nodejs构建的休闲个人机器人助手

    【标题】"trevor-bot" 是一个基于Node.js开发的个人机器人助手,它被设计用于微服务架构下的休闲应用。这个项目展示了如何利用JavaScript在分布式系统中构建一个交互式的智能助手。 【描述】"特雷弗" 提供了一个...

    一套接单站源码.zip

    6. **文档**:可能包含开发指南、使用说明、API文档等,帮助用户理解和部署源码。 总的来说,这套源码提供了一个完整的接单站解决方案,具有美观的用户界面和HTML5技术的支撑,适用于那些希望搭建类似平台但缺乏从...

    IFeelGreat

    8. **依赖管理文件**:如 "package.json"(Node.js项目)、"requirements.txt"(Python项目)等,列出了项目运行所需的所有外部库。 9. **构建脚本**:如 "build.sh" 或 "setup.py",用于构建、打包或发布项目的...

    gosho-everywhere:无处不在!

    JavaScript 是一种广泛用于Web开发的脚本语言,能够处理前端(浏览器端)和后端(服务器端)的任务。这通常意味着gosho-everywhere 可能是一个基于Web的应用程序,或者至少其一部分是利用JavaScript来实现的,可能...

    2023最新款数码盲盒源码 亲测搭建 可打包app【源码+教程】

    - 安装必要的开发工具和依赖库(如Node.js、MySQL等)。 2. **源码部署**: - 下载源码并解压至指定目录下。 - 按照文档指引完成数据库配置及其他初始化设置。 3. **功能测试**: - 在部署完成后进行全面的...

    XX网站项目方案

    例如,前端可能采用React或Vue.js,后端可能用Node.js或Python的Django,数据库可能选择MySQL或MongoDB。 5. **设计原则与UI/UX**:讨论网站的设计风格、色彩搭配、布局以及用户体验设计。这将直接影响用户对网站的...

Global site tag (gtag.js) - Google Analytics