Node.js : 我只需要一个店小二

白店小二:神奇的运算符“|=” 猛的一看以为是不等于!=,仔细看了看发现是或等于|=,这下更蒙了,|=是什么鬼?之前完全没见过。 查了资料,看看写文章,发现是这么回事。 let a = 1; // 0001 a |= 2; // a = a|2 console.log(a); // 3 a初值为1,转为二进制是0001。 a|=2的意思就是a=a|2,就是让a与2做或运算。 2转二进制是0010,与0001做或运算。 0001 0010 —— 0011 结果就是0011,也就是3. ... 阅读详情

刚刚开始接触Node.js时, google了很多文章,但发现大部分都是泛泛的介绍安装,配置,以及介绍几个小例子

有一种雾里观花的感觉,所以非常困惑,不知道Node.js到底解决了什么问题,它的优势到底在哪儿,为什么这么火。

 

经过了一番学习之后, 自认为对Node.js的基本原理有了些了解, 于是杜撰了下面这个故事,希望对大家有所帮助,能给大家一点启发

 

 

美丽的七侠镇上有一条美食街,很多著名的饭店都开在这里,有老字号的Apache, PHP, 最近几年火热的Ruby on Rail ,
还有那些重量级的餐饮集团Websphere, Weblogic 等。

这些饭店老板根据自己的实力,或多或少的雇佣了一些店小二来招待来客,这些小二干活都非常殷勤,没有一个偷懒耍滑,把顾客招待的舒舒服服, 所以平日里饭馆运转的还不错,相安无事。

但是随着七侠镇旅游业开发,游客像潮水一样蜂拥而至, 现有的店小二招待不过来了, 到了饭点,每家的门前都排起了长队,游客们吃不上饭,个个怨声载道。


看到这种情况,有些老板咬了咬牙,在人工费不断上涨的情况下, 多雇了一些小二来帮忙, 无奈总是赶不上顾客增长的速度。

 

某一天有个美国老外来到七侠镇上旅游, 也看到了吃不上饭的问题,他仔细分析了一番后发现了一个秘密: 原来这些店都采用了同一套叫做“全程贴心服务”的模式, 这个模式很有意思:

客人来了以后,马上有个店小二殷勤迎上去,带着找座位,点菜,给后厨下单

由于后厨做菜需要很长时间,店小二就在客人的旁边等着。

后厨大喊一声:上菜,店小二马上端到客人面前, 然后站在一边等着客人吃完

客人说:结账,小二收钱,找钱,送客, 迎接下一位。

通常这个时候门口都排成了好几百人了

 

实在是太贴心了! 导致的结果很明显,饭店有几个店小二,就只能同时接待几个顾客。

(当然,现实中是没有饭店是这么做的,否则就等着关门吧)

 

老外一声不吭的回去了。

过了几个月, 美食一条街上出现了一个巨火无比的饭馆: Node.js

虽然这个饭店中人满为患, 可门口竟然没有排队的

更让人吃惊的是,这个店里声称: 我只需要一个店小二!

 

Node.js这个美国老外开的饭店确实只用了一个店小二, 只不过这个小二干活的方式与众不同,他把所有的工作分为两类

(1) 马上就能干完的,例如迎客,点菜,找座,下单 等等

(2) 需要等待别人干完才能干的活,例如上菜,结账等

对(1) 这个小二马上干活

对(2) 店小二不会等待,他只是说,你弄完了告诉我一声,我会接着干, 然后马上去做第一类工作

 

客人来了以后,这个店小二殷勤迎上去,带着找座位,点菜,给后厨下单

由于后厨做菜需要很长时间,店小二闪电般的离开,去干别的活了,可能是迎客,点菜,找座等,总之是那些不用等待,迅速干完的活

后厨大喊一声:上菜,这个小二马上端到客人面前,然后离开,干其他活

客人说:结账,小二收钱,找钱,然后还是迅速闪人,干其他活

 

 

这个唯一的店小二的能力被发挥到了极致,一刻不停,闪电般的在饭店里跑来跑去,因为老板明确的告诉他: 不要等!

Node.js饭店的基础设施很强大,一旦那些耗时的操作完成,店小二立刻就能知道,飞奔过来马上接着干,如果遇到新的耗时的操作,小二毫不留情的离开。

就这么简单, Node.js饭店火了,它同时接待客人的数量大大增加,而服务质量保持基本不变。

 

OK,这是我杜撰出来的一个不成熟的故事,帮助我来理解Node.js的特点:只用一个线程来处理所有请求,事件驱动编程

如果我们回过头来再以计算机的视角看一下会更加清楚:

店小二: 线程

顾客:http请求

第一类工作(迎客,找座,下单) : 在服务器端的代码,能够快速执行

后厨做菜,客人吃饭: 耗时的I/O 操作

后厨大喊一声:上菜 : 这是一个长时间I/O 操作完成的后所发出的事件

客人说:结账: 另外一个长时间I/O 操作完成的后所发出的事件

第二类工作(上菜,结账) : 同样是能快速执行的代码,但是他们需要等待那些耗时的I/O 操作完成才能开始,确切的来说,收到了系统发出的事件以后才开始执行。在Node.js中实际上是在回调函数中来执行的

 

下面是Node.js服务模式的伪代码:

Java代码
  1. 迎客();  
  2. 找座();  
  3. 下单();  
  4. 后厨处理("做菜完成事件", function(){  
  5.     上菜处理;  
  6.     客人吃饭("吃饭完成事件",function(){  
  7.         结账处理;  
  8.         送客();  
  9.     });  
  10. });  

需要引起注意的是:

1. 后厨处理()这个函数接受两个参数,一个是事件名,另外一个是匿名的回调函数,事件发生,回调函数才会执行。

    客人吃饭()函数也是类似。

    Node.js 使用的javascript作为服务器端的编程语言,这种回调的方式对于javascript程序员来说,是非常自然的事情,同时从代码的角度来讲,也显得非常清晰。

    另外Node.js使用Chrome的V8引擎来执行javascript,效率非常高

2. 我们能不能把代码写成这样?

Java代码
  1. 迎客();  
  2. 找座();  
  3. 下单();  
  4. 后厨处理("做菜完成事件", function(){  
  5.     上菜处理;      
  6. });  
  7. 客人吃饭("吃饭完成事件",function(){  
  8.      结账处理;  
  9. });  
  10. 送客();   

    肯定不行!, 因为Node.js执行"后厨处理()"函数时,只是安插了一个匿名的回调函数在那里,并不会等待(非阻塞I/O),反而马上 会执行“客人吃饭()"函数,所以上述的写法会引起逻辑上的错误:还没上次就开始吃饭了!

所以写惯了”顺序阻塞I/O“的我们需要改变一下思维方式,进入到事件驱动的世界中来。

 

3. 如果某个操作例如“上菜处理” 是个CPU密集型的计算任务,Node.js那个唯一的线程就会忙于执行这个计算任务而被Block 住,就无法响应其他的请求了,带来的后果很严重,整个服务器都无法响应了!  这个时候,需要考虑把这样的代码进行异步处理

 

 

这里我只是粗浅的讨论了Node.js的原理, 哪位同学要想亲自动手试一试的话,这里是一篇非常好的Node入门文章:Node入门

另外还有两篇深入介绍的文章,非常值得一读(虽然是英文的)

理解Node.js 事件循环

理解Node.js

 

 

后记: 第一次看到Node.js, 确实挺吃惊的, 把javascript 作为服务器端的编程语言,只用一个线程来处理所有请求!

它的作者Ryan Dahl 确实敢想敢干, 再一次体现了美国人的创新精神,非常值得我们学习。

中国的程序员也需要反思一下,我们为什么没有想到? 我们为什么没有做出来?

 

ICM42670-P嵌入式开发实战:从寄存器配置到姿态解算全解析 本文全面解析ICM42670-P高性能6轴MEMS运动传感器的嵌入式开发实战,涵盖寄存器配置、数据采集滤波、低功耗优化及姿态解算算法。通过详细代码示例和应用案例,帮助开发者快速掌握从硬件对接到姿态跟踪系统的完整开发流程,适用于可穿戴设备和智能家居等低功耗应用场景。 阅读详情

相关推荐

告别环境配置噩梦:VSCode + MinGW 下 OpenGL (glad/glm/glfw) 一站式配置指南(含常见错误排查)

本文提供了一份详细的VSCode与MinGW下OpenGL开发环境配置指南,涵盖glad、glm和glfw三大核心库的安装与调试。通过逐步指导解决常见错误,帮助开发者快速搭建高效的OpenGL开发环境,特别适合初学者避免环境配置中的常见陷阱。

weixin_42557803的博客 490

Node.js : 我只需要一个店小二

刚刚开始接触Node.js时, google了很多文章,但发现大部分都是泛泛的介绍安装,配置,以及介绍几个小例子 有一种雾里观花的感觉,所以非常困惑,不知道Node.js到底解决了什么问题,它的优势到底在哪儿,为什么这么火。   经过了一番学习之后, 自认为对Node.js的基本原理有了些了解, 于是杜撰了下面这个故事,希望对大家有所帮助,能给大家一点启发     美丽的七侠镇上有一条...

ender 348

USB HID虚拟电池:Windows零驱动电源状态模拟方案

虚拟电池是一种在硬件测试与功耗分析中替代真实电池、实现可控电源状态注入的关键技术。其核心原理是通过标准USB HID协议(特别是UPS设备类)向操作系统上报可编程的AC/DC状态、剩余电量、容量参数等,绕过内核驱动限制,达成毫秒级响应与跨Windows版本兼容。该技术显著提升SoC能效验证、电池健康度校准及低电量行为触发等场景的可重复性与精度。本文基于CH554微控制器实现符合HID UPS规范的物理层虚拟电池设备,支持零驱动安装、USB原生识别与实时参数调控,适用于笔记本平台功耗建模、电源管理策略验证及自

weixin_35755188的博客 354

没用过Node.js,就别瞎逼逼

本来不想回复的,匿名的那哥们写的挺好的,虽然不懂他为什么要匿名。但看到某些回复,不得不说几句。乱解读,误人子弟的事,还是有必要澄清的,以免Node有无端被黑,相信这也是所有布道者都应该承担这种除魔卫道的责任。没有领袖,Node 之父用 Go,TJ 也用 Go,都跑了。1) 语言不是因素,是他想做的事儿变了,但他的心依然还是爱着KoaTJ转做Go有很多原因人家做的基于aws Lambda的基础设施

Node全栈 2万+

EPICS pythonSoftIOC教程

EPICS pythonSoftIOC教程

yuyuyuliang00的博客 1521

c#窗体应用(.NET Framework)项目对Yaml文件进行写入与读取,Yaml数据转换成json

用到的技术与版本准备工作Yaml数据在C#中进行定义对Yaml文件的读取与写入代码的添加窗体控件控制操作写入数据到Yaml文件读取Yaml文件数据Yaml数据转换成json改进——对yaml文件读取时根据yaml文件中的键进行获取,对c#中怎么取名字无关yaml文件中多个数据读取遇到的问题总结的小点参考的文章在对Yaml文件进行读取前,先将Yaml文件中的数据结构在c#中进行定义,以便后面更好的读取。这里对这四个类型进行举例(这里为了想看看这四个类型到Yaml文件的格式是什么样子的)

永远年轻 1587

我与node.js

Email:longsu2010 at yeah dot net  从第一次接触node.js到现在时间不短了,那时node.js还是0.5版本,现在最新版是0.10版本。从这个版本号你可以发现node.js的版本号很有趣,需要你注意,如0.8.5版本低于0.8.14版本。 当时也就是因为好奇所以拿来玩玩,记得是和HTML5的WebSocket一起玩的,现如今WebSocket在我

小姜哥的技术博客 1674

【STM32项目】基于stm32智能鱼缸控制系统的设计与实现(完整工程资料源码)

随着现代化经济的快速发展,物质条件富足的人开始追求精神富足,越来越多的人通过饲养观赏鱼来充实生活、释放压力,但并非所有饲养者都有时间和经验来管理好鱼缸。一种由单片机控制,可实时检测和调节鱼缸环境,可把鱼缸环境实时反映给用户并能被用户远程操控的系统,可以解决养鱼成活率低、耗费时间和精力、参与感不强等诸多难题。

嵌入式技术开发 7351

【转】【译】Node.js 是什么?

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。作者:贾厂长链接:https://www.zhihu.com/question/33578075/answer/56951771来源:知乎 如果你去年注意过技术方面的新闻,我敢说你至少看到node.js不下一两次。那么问题来了“node.js是什么?”。有些人没准会告诉你“这是一种通过JavaScript语言开发web服务端的东...

weixin_30713953的博客 724

沁恒CH32V30X学习笔记02--GPIO的使用教程及2次封装驱动

刚复位后,GPIO 口运行在初始状态,这时大多数 IO 口都是运行在状态所有的 GPIO 口都可以被配置外部中断输入通道,但一个外部中断输入通道最多只能映射到一个GPIO 引脚上,且外部中断通道的序号必须和 GPIO 端口的位号一致,,两方都是一对一的关系。复用功能。

Car12 705

东北大学计算机预推免(双非友好)

东北大学,个人觉得在985里面对双非比较友好,而且学校的计算机专业实力也比较强,上岸难度不算很大,可以重点关注一下。学校复试审核的时间比较早,拿到复试资格之后,一定要留意报名系统首页中计算机学院的信息,学校也会在全国各地不同时间安排面试,可以根据自己的情况选择一个合适的时间前去面试,并且有对应面试场次的QQ群,信息会在群里面发布。面试成绩会在预推免系统中直接公布,但是是否拟录取不会公布,需要考生自行判断,今年计算机学院录取线定在了86分左右,最终递补下来,好像录取到了84分左右。

D1379951481的博客 3120

node.js

首先要了解Node.js,我们可以先要了解什么是v8引擎,可以说Node.js的诞生很大程度上归功于v8引擎的出现。 我们都知道计算机处理器智能识别机器语言,而JavaScript是一门高级语言,计算机并不能直接读懂。所以我们需要所谓的引擎来将其转化成计算机所能理解的语言。v8引擎是由Google推出的,为其浏览器Chrome所设计的开源JavaScript引擎。得益于JIT,编译模式的改变与编译阶段的优化,JavaScript的性能得到了一个飞跃。其源代码是用c++写的,感兴趣的可以点GitHub - v

棠樾的博客 306

基于Simulink的异步电机定子磁链定向控制(SFOC)仿真

本文带你从零构建了异步电机SFOC系统​ 的完整Simulink仿真模型,实现了:✅ 搭建异步电机、逆变器、风机负载的主电路与传感器模型;✅ 用MATLAB Function实现定子磁链观测(电压模型)、坐标变换、双闭环PI控制;✅ 验证SFOC在转速跟踪(响应0.2s、超调4%)、转矩响应(恢复0.15s)中的高性能;✅ 对比RFOC,明确SFOC在参数鲁棒性(转子电阻+50%时波动<2%)上的独特优势;✅ 理解SFOC“定子磁链定向+解耦控制”的核心思想(低成本高鲁棒性驱动的工程实现)。

xiaoheshang_123的博客 389

小白聊node.js-----node.js怎么工作

美丽的七侠镇上有一条美食街,很多著名的饭店都开在这里,有老字号的Apache,PHP,最近几年火热的RubyonRail,还有那些重量级的餐饮集团Websphere,Weblogic等。 这些饭店老板根据自己的实力,或多或少的雇佣了一些店小二来招待来客,这些小二干活都非常殷勤,没有一个偷懒耍滑,把顾客招待的舒舒服服,所以平日里饭馆运转的还不错,相安无事。 但是随着...

weixin_38610651的博客 254

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

这门国产编程语言,悄悄推出了新功能,碾压Node.js

对应到计算机世界,耗时的操作就是访问文件/数据库/网络,网络服务器的线程遇到了这些I/O操作,坚决不能等待,因为服务器收到的请求可不是几十个几百个,而是成千上万个,所以一定要采用异步编程。其设计思路与 Node.js 类似:采用。下面是一个 HTTP 服务器的例子,相比 TCP 服务器,HTTP 例子需要进行 HTTP 协议的解析,有更多的计算成分,不是单纯的 I/O。但是对程序员来说,异步编程很麻烦,为了支持任务的中断和切换,程序的逻辑会被分散到程序的不同部分,使得开发效率和程序的可维护性极大下降。

码农翻身 996

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Java能抵挡住JavaScript的进攻吗?

JavaScript的进攻公元2014年,Java 第八代国王终于登上了王位。第一次早朝,国王坐在高高的宝座上,看着毕恭毕敬的大臣,第一次体会到了皇权的威力。德高望重的I...

码农翻身 400

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java 能抵挡住 JavaScript 的进攻吗?

作者 |刘欣本文经授权转自公众号“码农翻身”JavaScript 的进攻公元 2014 年,Java 第八代国王终于登上了王位。第一次早朝,国王坐在高高的宝座上,看着毕...

优快云资讯 1885

Java能抵挡住JavaScript的进攻吗?【转载】

JavaScript的进攻 公元2014年,Java 第八代国王终于登上了王位。 第一次早朝,国王坐在高高的宝座上,看着毕恭毕敬的大臣,第一次体会到了皇权的威力。 德高望重的IO大臣颤悠悠地走上前来:“启禀陛下,昨日收到战报,有个叫做Node.js的番邦又一次向我国进攻,我边防将士死伤惨重。” “Node.js? 那是什么东西?”  国王心中一乐, 还真有人自不量力,想蚍蜉撼树。 想我Ja...

银剑的博客 267

PCA9422与PIC18F45K50的嵌入式电源管理方案实战解析

电源管理是嵌入式系统稳定运行的基石,尤其在核心板、便携设备和电池供电产品中,多路电压输出、上电时序、纹波控制与故障恢复直接决定系统可靠性。通常,PMIC负责功率变换与保护,MCU负责策略控制,两者结合可灵活实现动态电压调节、故障上报与日志记录。PCA9422作为多路PMIC,支持I2C配置输出电压与软启动参数,配合PIC18F45K50的状态机与USB日志能力,能够构建完整且可维护的电源子系统。本文从选型、系统架构、硬件设计、固件实现到实测排错,详细拆解基于这两颗芯片的电源管理方案,提供可直接落地的工程实践

weixin_34234721的博客 348

Java地位被撼动?Java与JavaScript的趣事连载

第一回 JavaScript的进攻 公元2014年,Java 第八代国王终于登上了王位。 第一次早朝,国王坐在高高的宝座上,看着毕恭毕敬的大臣,第一次体会到了皇权的威力。 德高望重的IO大臣颤悠悠地走上前来:“启禀陛下,昨日收到战报,有个叫做Node.js的番邦又一次向我国进攻,我边防将士死伤惨重。” “Node.js? 那是什么东西?”国王心中一乐, 还真有人自不量力,想蚍蜉撼树。 想...

weixin_30739595的博客 213
上一篇: 茶余饭后:聊一聊那些神一样的程序员们(2)
下一篇: 一个程序员的科幻小说
Andy
博客等级 码龄26年 115粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值