由Node.js事件驱动模型引发的思考

引言

近段时间听说了Node.js,很多文章表述这个事件驱动模型多么多么优秀,应用在服务器开发中有很大的优势,本身对此十分感性去,决定深入了解一下,由此也引发了一些对程序设计的思考,记录下来。

什么是Node.js

Node.js在官网上是这样定义的:“一个搭建在Chrome JavaScript运行时上的平台,用于构建高速、可伸缩的网络程序。Node.js采用的事件驱动非阻塞I/O模型使它既轻量又高效,是构建运行在分布式设备上的数据密集型实时程序的完美选择。”

Node.js的事件驱动

简单来说就是只有一个线程,所有IO操作(网络,文件访问等)都是异步的,通过回调来响应处理。

Node.js做了什么

Node.js将网络,文件,数据库等操作等都实现了异步接口,让开发者所设计的程序只跑在一个线程上,易于设计出性能良好的高并发网络程序。

如果不采用异步的方式来实现,可能的处理方式有针对每一个连接建立一个线程处理,有多少个连接就建立多少个线程,每一个线程独立不互相干扰。乍一看这么处理是没有问题的,但是要知道线程的创建是有代价的,如果按照这么处理在连接数上万,就已经很难处理过来的,创建线程浪费了大量资源。

Node.js的劣势

从前文的描述中可以看出Node.js的事件驱动机制在IO密集型应用中,是有比较大的优势的,那么考虑另外一种场景,CPU密集型应用(如数据加密,压缩)。由于Node.js的代码是在一个线程中运行的,这种情况下事件循环就被阻塞住了。当然Node.js也提供了一下其他机制(nextTick,child_process等)解决这种场景,但是看起来这些实现可以说是比较丑陋的。

关于程序设计的思考

感觉Node.js的设计在IO密集型应用上有优势是值得在程序设计中参考借鉴的,如果在支持多线程的语言中采用如下设计是不是既拥有事件驱动的优势又避免了在CPU密集型场景下的劣势呢?

  1. 整体业务逻辑基于事件驱动的处理,可以避免许多多线程操作中繁琐、易错的地方。
  2. CPU密集高运算的场景使用线程处理,主线程回调处理结果。

最后

对Node.js也只是简单的了解一下,并未深入学习,有什么错漏大家勿喷。

来自为知笔记(Wiz)

时间: 2024-12-27 15:16:50

由Node.js事件驱动模型引发的思考的相关文章

浅谈Node.js单线程模型

Node.js采用 事件驱动 和 异步I/O 的方式,实现了一个单线程.高并发的运行时环境,而单线程就意味着同一时间只能做一件事,那么Node.js如何利用单线程来实现高并发和异步I/O?本文将围绕这个问题来探讨Node.js的单线程模型: 1.高并发 一般来说,高并发的解决方案就是多线程模型,服务器为每个客户端请求分配一个线程,使用同步I/O,系统通过线程切换来弥补同步I/O调用的时间开销,比如Apache就是这种策略,由于I/O一般都是耗时操作,因此这种策略很难实现高性能,但非常简单,可以实

【转】浅谈Node.js单线程模型

Node.js采用 事件驱动 和 异步I/O 的方式,实现了一个单线程.高并发的运行时环境,而单线程就意味着同一时间只能做一件事,那么Node.js如何利用单线程来实现高并发和异步I/O?本文将围绕这个问题来探讨Node.js的单线程模型: 1.高并发 一般来说,高并发的解决方案就是多线程模型,服务器为每个客户端请求分配一个线程,使用同步I/O,系统通过线程切换来弥补同步I/O调用的时间开销,比如Apache就是这种策略,由于I/O一般都是耗时操作,因此这种策略很难实现高性能,但非常简单,可以实

理解Node.js事件驱动编程

Node.js现在非常活跃,相关生态社区已经超过Lua(基本上比较知名的功能都有nodejs模块实现). 但是我们为何要使用Node.Js?相比传统的webserver服务模式,nodejs有什么优点优势? Node.Js是基于javascript语言,建构在google V8 engine以及Linux上的一个非阻塞事件驱动IO框架.nodejs是单进程单线程,但是基于V8的强大驱动力,以及事件驱动模型,nodejs的 性能非常高,而且想达到多核或者多进程也不是很难(现在已经有大量的第三方mo

对Node.js的异步机制的思考

Node.js的异步机制是其最大的特色,异步可以应对高并发,具有很好的性能. 但是如果在某个方法里,涉及到数据库的多层查询,异步机制反而成为阻碍.当执行完第一层SQL后,根据所得的结果集(rows)进行结果集进行遍历时,每次遍历的结果作为where条件再执行下一层SQL时,下一层及以后的SQL并不会执行,而是在结果集(rows)遍历到最后时,才执行下一层SQL. 这时,若SQL只有两三层,其实倒还好,可以合并SQL:但是SQL层数多了之后,这种异步机制却是最大的阻碍.这时,就需要用到Node.j

从智能垃圾桶模型引发的思考?

背景: 随着人们的生活水平不断提高,家居生活现代化是个必然的趋势.智能垃圾桶很好的解决了无需接触垃圾桶就可投放垃圾,防止交叉感染等问题.减少生活当中各种病菌交叉感染的几率:无异味溢出.但其存在需要经常更换电池,电池寿命问题. 目的: 第一:通过这篇文章,大致能了解目前市面上智能垃圾桶的工作原理. 第二:当使用电池供电,可能对于此产品来讲,功耗会偏大.采用外部供电方式,是否能满足需求. 第三:设计一个产品模型可能不需要考虑很多因素,但设计一款产品考虑因素还有哪些,讨论一下. 实验材料 Arduin

node.js初步了解(2)

1. windown下 npm 升级: npm install npm -g 2. Node.js事件驱动模型:设计模型--观察者模型. 3. node.js全局变量:global 4. node,js  express 框架 1 var express=require('express'); 2 var app=express(); 3 app.get('/',function(req,res){ 4 res.send('hello!'); 5 }); 6 7 app.listen(5000,

为什么要使用 Node.js

Node.js 是什么 传统意义上的 JavaScript 运行在浏览器上,这是因为浏览器内核实际上分为两个部分:渲染引擎和 JavaScript 引擎.前者负责渲染 HTML + CSS,后者则负责运行 JavaScript.Chrome 使用的 JavaScript 引擎是 V8,它的速度非常快. Node.js 是一个运行在服务端的框架,它的底层就使用了 V8 引擎.我们知道 Apache + PHP 以及 Java 的 Servlet 都可以用来开发动态网页,Node.js 的作用与他们

为什么要用 Node.js

这是一个移动端工程师涉足前端和后端开发的学习笔记,如有错误或理解不到位的地方,万望指正. Node.js 是什么 传统意义上的 JavaScript 运行在浏览器上,这是因为浏览器内核实际上分为两个部分:渲染引擎和 JavaScript 引擎.前者负责渲染 HTML + CSS,后者则负责运行 JavaScript.Chrome 使用的 JavaScript 引擎是 V8,它的速度非常快. Node.js 是一个运行在服务端的框架,它的底层就使用了 V8 引擎.我们知道 Apache + PHP

Node.js 教程 05 - EventEmitter(事件监听/发射器 )

目录: 前言 Node.js事件驱动介绍 Node.js事件 注册并发射自定义Node.js事件 EventEmitter介绍 EventEmitter常用的API error事件 继承EventEmitter 前言: 今天事儿太多了,没有发太多的东西.不好意思了各位. 本篇主要介绍Node.js中的事件驱动,至于Node.js事件概念的东西,太多了. 本系列课程主要抱着的理念就是,让大家慢慢的入门,我也尽量写的简单一点. 所以呢,本文事件驱动,大家的目标应该是:理解Node.js的事件驱动.会