博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
什么是node.js的事件驱动编程
阅读量:6827 次
发布时间:2019-06-26

本文共 1941 字,大约阅读时间需要 6 分钟。

hot3.png

Node.js现在非常活跃,相关生态社区已经超过Lua(基本上比较知名的功能都有nodejs模块实现)。但是我们为何要使用Node.Js?相比传统的webserver服务模式,nodejs有什么优点优势?

Node.Js是基于javascript语言,建构在google V8 engine以及Linux上的一个非阻塞事件驱动IO框架。nodejs是单进程单线程,但是基于V8的强大驱动力,以及事件驱动模型,nodejs的性能非常高,而且想达到多核或者多进程也不是很难(现在已经有大量的第三方module来实现这个功能)。

这里主要不是介绍nodejs具体应用代码,而是想介绍一下事件驱动编程。

Dan York介绍了两种典型的事件驱动实例。

第一个例子是关于医生看病。

在美国去看医生,需要填写大量表格,比如保险、个人信息之类,传统的基于线程的系统(thread-based system),接待员叫到你,你需要在前台填写完成这些表格,你站着填单,而接待员坐着看你填单。你让接待员没办法接待下一个客户,除非完成你的业务。

想让这个系统能运行的快一些,只有多加几个接待员,人力成本需要增加不少。

基于事件的系统(event-based system)中,当你到窗口发现需要填写一些额外的表格而不仅仅是挂个号,接待员把表格和笔给你,告诉你可以找个座位填写,填完了以后再回去找他。你回去坐着填表,而接待员开始接待下一个客户。你没有阻塞接待员的服务。

你填完表格,返回队伍中,等接待员接待完现在的客户,你把表格递给他。如果有什么问题或者需要填写额外的表格,他给你一份新的,然后重复这个过程。这个系统已经非常高效了,几乎大部分医生都是这么做的。如果等待的人太多,可以加入额外的接待员进行服务,但是肯定要比基于线程模式的少得多。

第二个例子是快餐店点餐。

在基于线程的方式中(thread-based way)你到了柜台前,把你的点餐单给收银员或者给收银员直接点餐,然后等在那直到你要的食物准备好给你。收银员不能接待下一个人,除非你拿到食物离开。想接待更多的客户,容易!加更多的收银员!

当然,我们知道快餐店其实不是这样工作的。他们其实就是基于事件驱动方式,这样收银员更高效。只要你把点餐单给收银员,某个人已经开始准备你的食物,而同时收银员在进行收款,当你付完钱,你就站在一边而收银员已经开始接待下一个客户。在一些餐馆,甚至会给你一个号码,如果你的食物准备好了,就呼叫你的号码让你去柜台取。关键的一点是,你没有阻塞下一个客户的订餐请求。你订餐的食物做好的事件会导致某个人做某个动作(某个服务员喊你的订单号码,你听到你的号码被喊到去取食物),在编程领域,我们称这个为回调(callback function)。

Node.Js做了什么工作呢?

传统的web server多为基于线程模型。你启动Apache或者什么server,它开始等待接受连接。当收到一个连接,server保持连接连通直到页面或者什么事务请求完成。如果他需要花几微妙时间去读取磁盘或者访问数据库,web server就阻塞了IO操作(这也被称之为阻塞式IO).想提高这样的web server的性能就只有启动更多的server实例。

相反的,Node.Js使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)。

考虑下面这个过程:

  1. 你用浏览器访问nodejs服务器上的"/about.html"
  2. nodejs服务器接收到你的请求,调用一个函数从磁盘上读取这个文件。
  3. 这段时间,nodejs webserver在服务后续的web请求。
  4. 当文件读取完毕,有一个回调函数被插入到nodejs的服务队列中。
  5. nodejs webserver运行这个函数,实际上就是渲染(render)了about.html页面返回给你的浏览器。

好像就节省了几微秒时间,但是这很重要!特别是对于需要相应大量用户的web server。

这也就是为什么Node.Js这么热这么惹人关注。而且它还使用了一个非常通用的编程语言Javascript,也让开发者可以快速容易的编写高可扩展性服务器。

Node 非常适合以下情况:在响应客户端之前,您预计可能有很高的流量,但所需的服务器端逻辑和处理不一定很多

转载于:https://my.oschina.net/erichsbc/blog/120581

你可能感兴趣的文章
“Too many open files” 小记
查看>>
tomcat报错
查看>>
【xamarin + MvvmCross 从零开始】八、Android Fragment 的使用
查看>>
TOJ 3046: 招商银行网络系统
查看>>
java8_api_正则表达式
查看>>
java匿名对象
查看>>
RichTextBox.MouseWheel事件控制父控件Panel的内容滚动
查看>>
php程序在浏览器哪里判断,一个判断PHP程序是否被同时在不同浏览器上执行的问题...
查看>>
php 获取5分钟前,php时间轴开发,即显示为“刚刚”、“5分钟前”、“昨天12:10...
查看>>
php ob_end_clean(),ob_end_clean(): failed to delete buffer-ThinkPHP 5.1.23
查看>>
ecshop send.php on line 71,ECSHOP调用指定DEDECMS织梦栏目文章列表
查看>>
linux 怎么运行多个target,radhat7下使用targetcli为多个启动器配置iSCSI访问控制
查看>>
c语言2015实验答案,2015年计算机二级《C语言》精选练习题及答案(15)
查看>>
c语言中word16,(word)16道嵌入式C语言面试题.doc
查看>>
c语言雷克子波,vans.c · skateboi/雷克子波与一维数组卷积的图像 - Gitee.com
查看>>
c语言ctrl c线程中动态申请的内存,【C++】 外传篇 3_动态内存申请的结果
查看>>
android textview显示不下,Android TextView不显示我的所有文本
查看>>
android手机之间tcp通信,Android 设备间通信方式
查看>>
数据库集群系统研究系列(2)-现存的数据库的解决方案的原理解析
查看>>
Racktables自定义报表
查看>>