- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第二章:Node 介绍
本章内容:
什么是事件驱动编程,有什么优点
Node.js 如何简化了事件驱动开发
在传统程编程模里,I/O 操作就像一个普通的本地函数调用:在函数执行完之前程序被
堵塞,无法继续运行。堵塞I/O 起源于早先的时间片模型,这种模型下每个进程就像一个独
立的人,目的是将每个人区分开,而且每个人在同一时刻通常只能做一件事,必须等待前面
的事做完才能决定下一件事做什么。但是这种在计算机网络和 Internet 上被广泛使用的“一
个用户,一个进程”的模型伸缩性很差。管理多个进程时,会耗费很多内存,上下文切换也
会占用大量资源,这些对操作系统是个很大的负担,而且随着进程数的递增,会导致系统性
能急剧衰减。
多线程是个替代方案,线程是一个轻量级的进程,它会和同一个进程内的其它线程共享
内存,它更像传统模型的扩展,用来并发执行多个线程,当一个线程等待I/O 操作时,其它
线程可以接管CPU,当I/O 操作完成,前面等待的线程会被唤醒。就是说,一个运行中的线
程可以被中断,然后稍候再被恢复。此外,在一些系统下线程可以在多核 CPU 的不同核心
下并行运行。
程序员并不知道线程会在什么具体时间运行,他们必须很小心的处理共享内存的并发访
问,因此必须使用一些同步原语来同步访问某个数据结构,比如使用锁或信号量,以此来强
制线程以特定的行为和计划执行。那些大量依赖线程间的共享状态的应用程序,很容易就会
出现一些随机性很强,难以查找的奇怪问题。
还有一种方式是使用多线程协作,由你自己负责显式的释放CPU,并把CPU 时间交给
其他线程使用,因为由你亲自来控制线程的执行计划,因此减小了对同步的需求,但是也提
高了程序的复杂度和出错的机会,而且并没有避免多线程的那些问题。
什么是事件驱动编程
事件驱动编程(Evnet-driven programming )是一种编程风格,由事件来决定程序的执行
流程,事件由事件处理器(event handler )或事件回调(event callback)来处理,事件回调
是当某个特定事件发生时被调用的函数,比如数据库返回了查询结果或者用户单击了一个按
钮。
回想下,在传统的堵塞I/O 编程模式里,数据库查询可能像这样:
result = query(SELECT * FROM posts WHERE id = 1);
do_something_with(result);
上面的query 函数会让当前线程或进程一直处于等待状态,直到底层数据库完成查询操
作并返回。
在事件驱动模型里,这个查询会变成这样:
query_finished = function(result) {
译者:Jack Yao ,本系列其它文章请查看/2013/01/08/pro-node-article-list/
do_something_with(result);
}
query(SELECT * FROM posts WHERE id = 1, query_finished);
首先你定义了一个叫query_finished 的函数,它包含了查询完成后要做的事。然后把这
个函数当做参数传递给query 函数,当query 执行完毕会调用query_finished,而不是仅仅返
回查询结果。
当你感兴趣的事件发生时会调用你定义的函数,而不是简单的返回结果值,这种编程模
型就叫事件驱动编程或异步编程。这是Node 一个最明显的特性,这种编程模型意味着当前
进程在执行 I/O 操作时不会被阻塞,因此,多个I/O 操作可以并行执行,当操作完成后相应
的回调函数就会被调用。
事件驱动编程底层依赖于事件循环(event loop ),事件循环基本上是事件检测和事件处
理器触发这两种函数不断循环调用的一个结构。在每次循环里,事件循环机制需要检测发生
了哪些事件,当事件发生时,它找到对应的回调函数并调用它。
事件循环只是运行在进程内的一个线程,当事件发生时,事件处理器可以单独运行并且
不会被中断,也就是说:
在某个特定时刻最多有一个事件回调函数运行
任何事件处理器运行时都不会被中断
有了这个,开发人员就可以不再为线程同步和并发修改共享内存这些事头疼了。
一个众所周知的秘
文档评论(0)