理解Node.js的event loop
为什么80%的码农都做不了架构师?>>>
关于Node.js的第一个基本概念是I/O操作开销是巨大的:
所以,当前变成技术中最大的浪费来自于等待I/O操作的完成。有几种方法可以解决性能的影响:
同步方式:按次序一个一个的处理请求。利:简单;弊:任何一个请求都可以阻塞其他所有请求。
开启新进程:每个请求都开启一个新进程。利:简单;弊:大量的链接意味着大量的进程。
开启新线程:每个请求都开启一个新线程。利:简单,而且跟进程比,对系统内核更加友好,因为线程比进程轻的多;弊:不是所有的机器都支持线程,而且对于要处理共享资源的情况,多线程编程会很快变得太过于复杂。
第二个基本概念是每个连接都创建一个新线程是很消耗内存的(例如:你可以对比Nginx回想一下Apache内存耗尽的情景)。
Apache是多线程的:它为每个请求开启一个新的线程(或者是进程,这取决于你的配置),当并发连接增多时,你可以看看它是怎么一点一点耗尽内存的。Nginx和Node.js不是多线程的,因为线程的消耗太“重”了。它们两个是单线程、基于事件的,这就把处理众多连接所产生的线程/进程消耗给消除了。
Node.js中你的代码运行在单线程之中
确实只有一个线程:你不能并行执行任何代码,比如:下面的“sleep”将会阻塞sever1秒钟:
while(new Date().getTime() < now + 1000) {// do nothing}
当这段代码运行时,Node.js不会响应客户端任何请求,因为只有一个线程来运行你的代码,另外,如果你执行cpu密集的任务,比如重设图像的大小,它也会阻塞所有请求。
……然而,除了你的代码,其它的一切都是并行执行的
单线程没法让代码并行执行。但是所有I/O操作都是事件驱动、并行的,所以下面的代码不会阻塞server:
c.query('SELECT SLEEP(20);', function (err, results, fields) {if (err) {throw err;}res.writeHead(200, {'Content-Type': 'text/html'});res.end('Return from async DB query ');c.end();});
如果你在一次请求中执行这些,当数据库sleep时,其他请求也会立即被处理。
为什么异步比较好?什么时候我们应该从同步转移到异步/并行执行呢?
同步执行也不错,因为它简便了我们敲代码。但在使用异步时,你不必关心后端是怎么处理的。而且,在I/O操作时不会阻止其他请求,同时无需承担每个请求所产生的线程/进程的成本。
I/O操作时使用异步处理很好,因为I/O操作的成本比单纯执行代码要高的多,我们应该在等待I/O时做其它更有意义的工作。
转载于:https://my.oschina.net/freax/blog/413785
理解Node.js的event loop相关推荐
- 理解node.js中的 Event Loop
node中的 "event loop" 正是node能处理高并发的核心所在.也正是因为它,node虽然在本质上是个单线程,却能让大量的操作处于后台运行.这篇文章将详细说明 even ...
- 深入理解 Node.js 中的 Worker 线程
多年以来,Node.js 都不是实现高 CPU 密集型应用的最佳选择,这主要就是因为 JavaScript 的单线程.作为对此问题的解决方案,Node.js v10.5.0 通过 worker_thr ...
- 理解node.js(Understanding node.js)
因为最近自己在学习node.js,刚开始学.看到这篇文章挺有意思,介绍了一下node.js有助于理解基于事件驱动的回调,就翻译了一下. 英文原文: Understanding node.js 理解no ...
- 对于怎么理解js中Event Loop,你可以看这篇文章
javascript中event loop是什么 声明 源文档地址 介绍 如何你跟我一样的话,那么你一定会爱上javascript!虽然它不是一种比较完美的编程语言,但是严格地说,还有其它比javas ...
- linux进程退出所有tcp数据才发送,深入理解Node.js 进程与线程(8000长文彻底搞懂)...
前言 进程与线程是一个程序员的必知概念,面试经常被问及,但是一些文章内容只是讲讲理论知识,可能一些小伙伴并没有真的理解,在实际开发中应用也比较少.本篇文章除了介绍概念,通过Node.js 的角度讲解进 ...
- ajax 高并发请求,理解node.js处理高并发请求原理
很少分享技术文章,写的不好的地方请大家多多指教,本文是自己对于node.js的一些见解,如有纰漏请在评论区交流. 高并发策略 通常高并发的解决方案就是提供多线程模型,服务器为每个客户端请求分配一个线程 ...
- [译]理解Node.js事件驱动机制
学习 Node.js 一定要理解的内容之一,文中主要涉及到了 EventEmitter 的使用和一些异步情况的处理,比较偏基础,值得一读. 大多数 Node.js 对象都依赖了 EventEmitte ...
- [译]理解 Node.js 事件驱动架构
原文地址:Understanding Node.js Event-Driven Architecture 大部分 Node 模块,例如 http 和 stream,都是基于EventEmitter模块 ...
- [译]深入理解 Node.js Worker Threads
最近工作中又有可能需要写 Node.js 应用了,距离上次写 Node.js 应用也有好些年了,所以就开始重新熟悉下 Node.js 了.刚好最近又在学 Go,其最大的特点就是简单.轻量级的并发模型. ...
最新文章
- Linux_查看CPU信息、机器型号等硬件信息
- 关于前后端分离我的理解
- 创业——不可忽视的创业计划书!!!
- Go的string/int/int64转化
- 自然语言处理之神经网络基础(四)
- 网站产品设计应避免的7个误区
- CH - 0701 国王游戏(贪心+高精度运算)
- 二叉树创建及遍历算法(递归及非递归)(转)
- 【转】VS编译环境命令窗口中的命令
- 计算机信息科学蔺泽浩,上海交通大学计算机科学与工程系(CSE)
- Jsp+Ssh+Mysql实现的Java Web学生考勤管理
- 超级计算机TOP500、green500、graph500最新排名(2012.11)
- Linux安全配置规范
- 中国矿业大学python期末考试_中国矿业大学一体化网络校园网——CUMTDDNet-DrCOM网页版认证教程...
- layout_gravity和gravity的区别
- VS2015编译程序兼容XP
- 使用R进行文本数据挖掘
- android 画爱心进度条_android自定义圆形进度条,实现动态画圆效果
- 爬虫爬取煎蛋网美女图片
- Python 二进制文件流转图片
热门文章
- springboot幂等性_请问,springboot项目支付接口设计,如何保证支付的幂等性,并能给前端反馈友好的提示?...
- 华为云服务怎么弄金卡会员_万科牵手华为终端云服务,共建松山湖智慧商圈
- sqlite 查询 支持多用户同时_SQLite支持多进程同时操作数据库文件吗?
- ATM柜员机JAVA课程设计_ATM柜员机学年论文设计(Java课程设计)
- java词汇速查手册_java 词汇表速查手册
- 全国计算机等级考试东营,东营计算机等级考试报名时间
- dbgrideh 为什么只一行_Mysql性能优化:为什么count(*)这么慢?
- 小程序的点赞功能能和浏览次数功能_扫码点餐小程序好用吗?小程序还能实现哪些功能?...
- mysql百万数据根据索引查询_mysql创建多列索引查询百万表数据的性能优化经验分享...
- 类型“unknown”上不存在属性“foreach”_JavaScript红宝书第四版精简解析系列--映射Map数据类型...