由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密集型场景下的劣势呢?
整体业务逻辑基于事件驱动的处理,可以避免许多多线程操作中繁琐、易错的地方。
CPU密集高运算的场景使用线程处理,主线程回调处理结果。
最后
对Node.js也只是简单的了解一下,并未深入学习,有什么错漏大家勿喷。
转载于:https://www.cnblogs.com/vitoz/p/4872799.html
由Node.js事件驱动模型引发的思考相关推荐
- node.js事件驱动_了解Node.js事件驱动架构
node.js事件驱动 by Samer Buna 通过Samer Buna 了解Node.js事件驱动架构 (Understanding Node.js Event-Driven Architect ...
- Node.js 事件驱动
Node.js 最主要的两个亮点就是异步I/O 和 事件驱动.那么啥是事件驱动呢? 目录 浏览器的事件驱动 addEventListner和removeEventListener 事件绑定三要素 浏览 ...
- node.js事件驱动的非阻塞 I/O模型理解
都说Node.js是一个基于chrome V8引擎的js运行环境,用于方便地搭建响应速度快.易于扩展的网络应用,它有非阻塞.事件驱动模型的特性,有轻量高效的特点,适用于分布式设备上运行数据密集型的实时 ...
- [译]理解Node.js事件驱动机制
学习 Node.js 一定要理解的内容之一,文中主要涉及到了 EventEmitter 的使用和一些异步情况的处理,比较偏基础,值得一读. 大多数 Node.js 对象都依赖了 EventEmitte ...
- [译]理解 Node.js 事件驱动架构
原文地址:Understanding Node.js Event-Driven Architecture 大部分 Node 模块,例如 http 和 stream,都是基于EventEmitter模块 ...
- 一道JS面试题目引发的思考
今看到一道有意思的题目,引发很多未知的东西,页面上有html代码如下: <body> <form id="form1" runat="server&qu ...
- js事件驱动模型图解
- 在Node.js中使用事件,监听器,定时器和回调
Node.js通过其强大的事件驱动模型提供了可扩展性和性能,本篇文章的重点是理解该模型,以及它是如何不同于大部分Web服务器采用的传统线程模型的.了解事件模型至关重要,因为它可能迫使你改变设计应用程序 ...
- 性能追击:万字长文30+图揭秘8大主流服务器程序线程模型 | Node.js,Apache,Nginx,Netty,Redis,Tomcat,MySQL,Zuul
本文为<高性能网络编程游记>的第六篇"性能追击:万字长文30+图揭秘8大主流服务器程序线程模型". 最近拍的照片比较少,不知道配什么图好,于是自己画了一个,凑合着用,让 ...
最新文章
- Knockout应用开发指南 第六章:加载或保存JSON数据
- C#BindingSource用法、属性、事件
- JavaScript箭头函数(Arrow Function)
- dalsa线扫相机调试文档_线阵相机调试文档
- python 有效的字母异位词
- Stable Sort Aizu - ALDS1_2_C
- 【Linux】一步一步学Linux——mkdir命令(21)
- DeepSORT多目标跟踪算法
- 数据科学 IPython 笔记本 9.10 数组排序
- gamma分布_RAW和Gamma
- 中国替代运动器材市场趋势报告、技术动态创新及市场预测
- 在js中对HTML的radio标签和checkbox标签的选择项进行输出
- WIN7 VC2008 express 安装问题及其创建第一个cpp文件
- php安装Laravel框架 全过程 傻瓜式教学
- 前端面试题(带答案)
- 全球最顶级的十大创新公司
- matplotlib - spines 设置
- WordPress丸子小程序从零到一搭建小程序[小程序配置]
- OKR使用什么工具落地?
- 今年世界杯预测(阿根廷队冠军)
热门文章
- 数据库中自定义排序规则,Mysql中自定义字段排序规则,Oracle中自定义字段排序规则,decode函数的用法,field函数的用法
- 2022-2028年中国纤维增强聚合物行业市场调查研究及发展前景规划报告
- 常用开源协议介绍以及开源软件规范列表
- 记录一次简单、高效、无错误的linux上安装pytorch的过程
- SpringCloud Alibaba微服务实战(六) - 路由网关(Gateway)
- tf.shape()
- 2021年大数据Spark(十五):Spark Core的RDD常用算子
- Python的Xpath介绍和语法详解
- mysql屏蔽关键字实现方法_PHP屏蔽过滤指定关键字的方法
- python 把int类型转bytes以及把bytes 转int 类型(使用方法to_bytes ,from_byte, struct)