Submit Search
Upload
Nodejs异步的原理和缺陷
•
23 likes
•
3,250 views
M
mysqlops
Follow
Nodejs,异步, 原理,缺陷
Read less
Read more
Technology
Business
Report
Share
Report
Share
1 of 20
Recommended
章文嵩:使用LVS集群架设高可扩展的网络服务.pdf
章文嵩:使用LVS集群架设高可扩展的网络服务.pdf
XMourinho
使用LVS集群架设高可扩展的网络服务
使用LVS集群架设高可扩展的网络服务
Wensong Zhang
Linux二十周年 -致辞
Linux二十周年 -致辞
Wensong Zhang
20220224台中演講k8s
20220224台中演講k8s
chabateryuhlin
Erlang分布式系统的的领域语言
Erlang分布式系统的的领域语言
Feng Yu
Memcached vs redis
Memcached vs redis
qianshi
淘宝软件基础设施构建实践
淘宝软件基础设施构建实践
Wensong Zhang
20141128(刘胜)UTC2014分布式和云服务的思考与实践——支付清算行业分布式架构的探索
20141128(刘胜)UTC2014分布式和云服务的思考与实践——支付清算行业分布式架构的探索
liu sheng
Recommended
章文嵩:使用LVS集群架设高可扩展的网络服务.pdf
章文嵩:使用LVS集群架设高可扩展的网络服务.pdf
XMourinho
使用LVS集群架设高可扩展的网络服务
使用LVS集群架设高可扩展的网络服务
Wensong Zhang
Linux二十周年 -致辞
Linux二十周年 -致辞
Wensong Zhang
20220224台中演講k8s
20220224台中演講k8s
chabateryuhlin
Erlang分布式系统的的领域语言
Erlang分布式系统的的领域语言
Feng Yu
Memcached vs redis
Memcached vs redis
qianshi
淘宝软件基础设施构建实践
淘宝软件基础设施构建实践
Wensong Zhang
20141128(刘胜)UTC2014分布式和云服务的思考与实践——支付清算行业分布式架构的探索
20141128(刘胜)UTC2014分布式和云服务的思考与实践——支付清算行业分布式架构的探索
liu sheng
了解集群
了解集群
Feng Yu
Operation and Maintenance of Large-Scale All-Flash Memory Ceph Storage Cluste...
Operation and Maintenance of Large-Scale All-Flash Memory Ceph Storage Cluste...
Ceph Community
K8s removes dockershime
K8s removes dockershime
Philip Zheng
2018 LINE Tech Pulse 直通國際分享
2018 LINE Tech Pulse 直通國際分享
Jeremy Lin
美团点评技术沙龙14:美团四层负载均衡
美团点评技术沙龙14:美团四层负载均衡
美团点评技术团队
Container Security
Container Security
LinuxCon ContainerCon CloudOpen China
C1000K高性能服务器构建技术
C1000K高性能服务器构建技术
Feng Yu
MySQL和IO(下)
MySQL和IO(下)
Feng Yu
“云存储系统”赏析系列分享三:Sql与nosql
“云存储系统”赏析系列分享三:Sql与nosql
knuthocean
51 cto下载 51cto信息图:openshift vs cloudfoundry
51 cto下载 51cto信息图:openshift vs cloudfoundry
Hong Cai
豆瓣网技术架构变迁
豆瓣网技术架构变迁
reinhardx
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
Jackson Tian
Node.js 進攻桌面開發
Node.js 進攻桌面開發
Fred Chien
Nodejs部门分享
Nodejs部门分享
zffl
Jni文档
Jni文档
woshiwzy
OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发
leneli
深入浅出NodeJS
深入浅出NodeJS
sunzhenghua
2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swt
tka
Node.js长连接开发实践
Node.js长连接开发实践
longhao
lua & ngx_lua 的介绍与应用
lua & ngx_lua 的介绍与应用
hugo
Node js实践
Node js实践
myzykj
Inside VCL
Inside VCL
Sheng-Wei (Kuan-Ta) Chen
More Related Content
What's hot
了解集群
了解集群
Feng Yu
Operation and Maintenance of Large-Scale All-Flash Memory Ceph Storage Cluste...
Operation and Maintenance of Large-Scale All-Flash Memory Ceph Storage Cluste...
Ceph Community
K8s removes dockershime
K8s removes dockershime
Philip Zheng
2018 LINE Tech Pulse 直通國際分享
2018 LINE Tech Pulse 直通國際分享
Jeremy Lin
美团点评技术沙龙14:美团四层负载均衡
美团点评技术沙龙14:美团四层负载均衡
美团点评技术团队
Container Security
Container Security
LinuxCon ContainerCon CloudOpen China
C1000K高性能服务器构建技术
C1000K高性能服务器构建技术
Feng Yu
MySQL和IO(下)
MySQL和IO(下)
Feng Yu
“云存储系统”赏析系列分享三:Sql与nosql
“云存储系统”赏析系列分享三:Sql与nosql
knuthocean
51 cto下载 51cto信息图:openshift vs cloudfoundry
51 cto下载 51cto信息图:openshift vs cloudfoundry
Hong Cai
豆瓣网技术架构变迁
豆瓣网技术架构变迁
reinhardx
What's hot
(11)
了解集群
了解集群
Operation and Maintenance of Large-Scale All-Flash Memory Ceph Storage Cluste...
Operation and Maintenance of Large-Scale All-Flash Memory Ceph Storage Cluste...
K8s removes dockershime
K8s removes dockershime
2018 LINE Tech Pulse 直通國際分享
2018 LINE Tech Pulse 直通國際分享
美团点评技术沙龙14:美团四层负载均衡
美团点评技术沙龙14:美团四层负载均衡
Container Security
Container Security
C1000K高性能服务器构建技术
C1000K高性能服务器构建技术
MySQL和IO(下)
MySQL和IO(下)
“云存储系统”赏析系列分享三:Sql与nosql
“云存储系统”赏析系列分享三:Sql与nosql
51 cto下载 51cto信息图:openshift vs cloudfoundry
51 cto下载 51cto信息图:openshift vs cloudfoundry
豆瓣网技术架构变迁
豆瓣网技术架构变迁
Similar to Nodejs异步的原理和缺陷
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
Jackson Tian
Node.js 進攻桌面開發
Node.js 進攻桌面開發
Fred Chien
Nodejs部门分享
Nodejs部门分享
zffl
Jni文档
Jni文档
woshiwzy
OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发
leneli
深入浅出NodeJS
深入浅出NodeJS
sunzhenghua
2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swt
tka
Node.js长连接开发实践
Node.js长连接开发实践
longhao
lua & ngx_lua 的介绍与应用
lua & ngx_lua 的介绍与应用
hugo
Node js实践
Node js实践
myzykj
Inside VCL
Inside VCL
Sheng-Wei (Kuan-Ta) Chen
程式人雜誌 -- 2015 年5月號
程式人雜誌 -- 2015 年5月號
鍾誠 陳鍾誠
程式人雜誌 2015年五月
程式人雜誌 2015年五月
鍾誠 陳鍾誠
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
裕波 周
Node js feat pegasus
Node js feat pegasus
cnfi
Node.js 入門 - 前端工程開發實務訓練
Node.js 入門 - 前端工程開發實務訓練
Joseph Chiang
Node分享 展烨
Node分享 展烨
tb-vertical-guide
IKVM.NET 深入敵營的 Java
IKVM.NET 深入敵營的 Java
建興 王
PHP 的 Web 運行原理 - 非阻塞 I/O 模式
PHP 的 Web 運行原理 - 非阻塞 I/O 模式
建億 林
Javascript primer plus
Javascript primer plus
Dongxu Yao
Similar to Nodejs异步的原理和缺陷
(20)
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
Node.js 進攻桌面開發
Node.js 進攻桌面開發
Nodejs部门分享
Nodejs部门分享
Jni文档
Jni文档
OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发
深入浅出NodeJS
深入浅出NodeJS
2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swt
Node.js长连接开发实践
Node.js长连接开发实践
lua & ngx_lua 的介绍与应用
lua & ngx_lua 的介绍与应用
Node js实践
Node js实践
Inside VCL
Inside VCL
程式人雜誌 -- 2015 年5月號
程式人雜誌 -- 2015 年5月號
程式人雜誌 2015年五月
程式人雜誌 2015年五月
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
Node js feat pegasus
Node js feat pegasus
Node.js 入門 - 前端工程開發實務訓練
Node.js 入門 - 前端工程開發實務訓練
Node分享 展烨
Node分享 展烨
IKVM.NET 深入敵營的 Java
IKVM.NET 深入敵營的 Java
PHP 的 Web 運行原理 - 非阻塞 I/O 模式
PHP 的 Web 運行原理 - 非阻塞 I/O 模式
Javascript primer plus
Javascript primer plus
More from mysqlops
The simplethebeautiful
The simplethebeautiful
mysqlops
Oracle数据库分析函数详解
Oracle数据库分析函数详解
mysqlops
Percona Live 2012PPT:mysql-security-privileges-and-user-management
Percona Live 2012PPT:mysql-security-privileges-and-user-management
mysqlops
Percona Live 2012PPT: introduction-to-mysql-replication
Percona Live 2012PPT: introduction-to-mysql-replication
mysqlops
Percona Live 2012PPT: MySQL Cluster And NDB Cluster
Percona Live 2012PPT: MySQL Cluster And NDB Cluster
mysqlops
Percona Live 2012PPT: MySQL Query optimization
Percona Live 2012PPT: MySQL Query optimization
mysqlops
Pldc2012 innodb architecture and internals
Pldc2012 innodb architecture and internals
mysqlops
DBA新人的述职报告
DBA新人的述职报告
mysqlops
分布式爬虫
分布式爬虫
mysqlops
MySQL应用优化实践
MySQL应用优化实践
mysqlops
eBay EDW元数据管理及应用
eBay EDW元数据管理及应用
mysqlops
基于协程的网络开发框架的设计与实现
基于协程的网络开发框架的设计与实现
mysqlops
eBay基于Hadoop平台的用户邮件数据分析
eBay基于Hadoop平台的用户邮件数据分析
mysqlops
对MySQL DBA的一些思考
对MySQL DBA的一些思考
mysqlops
QQ聊天系统后台架构的演化与启示
QQ聊天系统后台架构的演化与启示
mysqlops
腾讯即时聊天IM1.4亿在线背后的故事
腾讯即时聊天IM1.4亿在线背后的故事
mysqlops
分布式存储与TDDL
分布式存储与TDDL
mysqlops
MySQL数据库生产环境维护
MySQL数据库生产环境维护
mysqlops
Memcached
Memcached
mysqlops
DevOPS
DevOPS
mysqlops
More from mysqlops
(20)
The simplethebeautiful
The simplethebeautiful
Oracle数据库分析函数详解
Oracle数据库分析函数详解
Percona Live 2012PPT:mysql-security-privileges-and-user-management
Percona Live 2012PPT:mysql-security-privileges-and-user-management
Percona Live 2012PPT: introduction-to-mysql-replication
Percona Live 2012PPT: introduction-to-mysql-replication
Percona Live 2012PPT: MySQL Cluster And NDB Cluster
Percona Live 2012PPT: MySQL Cluster And NDB Cluster
Percona Live 2012PPT: MySQL Query optimization
Percona Live 2012PPT: MySQL Query optimization
Pldc2012 innodb architecture and internals
Pldc2012 innodb architecture and internals
DBA新人的述职报告
DBA新人的述职报告
分布式爬虫
分布式爬虫
MySQL应用优化实践
MySQL应用优化实践
eBay EDW元数据管理及应用
eBay EDW元数据管理及应用
基于协程的网络开发框架的设计与实现
基于协程的网络开发框架的设计与实现
eBay基于Hadoop平台的用户邮件数据分析
eBay基于Hadoop平台的用户邮件数据分析
对MySQL DBA的一些思考
对MySQL DBA的一些思考
QQ聊天系统后台架构的演化与启示
QQ聊天系统后台架构的演化与启示
腾讯即时聊天IM1.4亿在线背后的故事
腾讯即时聊天IM1.4亿在线背后的故事
分布式存储与TDDL
分布式存储与TDDL
MySQL数据库生产环境维护
MySQL数据库生产环境维护
Memcached
Memcached
DevOPS
DevOPS
Nodejs异步的原理和缺陷
1.
node.js异步:原理和缺陷 赵成
2.
node.js util http
https fs Javascript模块 …… buffer child_process file net C模块 …… V8解析器 事件库 uv libeio libev
3.
主要内容 异步接口的实现 uv,libev,以及libeio
存在的问题
4.
异步的实现方式 Synchronous I/O
Multiplexingselect,pselect,poll,epoll,kqueue,libev 线程模拟glibcaio,libeio Kernel Native AIO,以及Windows Overlapped I/O前者问题多多,比如仅支持 O_DIRECT 方式来对磁盘读写后者用于在uv中实现Windows的异步I/O 在Linux下,node.js靠libev和libeio配合使用来实现异步I/O
5.
事件驱动的一个例子 var net
= require('net'); var server = net.createServer(function (socket) { socket.write("Echo server"); socket.pipe(socket); }); server.listen(1337, "127.0.0.1"); static Handle<Value> Connect(constArguments&) { ... uv_tcp_connect(..., AfterConnect); ... }
6.
7.
*nix下uv是对libev的封装
8.
9.
10.
另一个例子:fs.close (fd) static
Handle<Value> Close(const Arguments& args) { intfd = args[0]->Int32Value(); if (args[1]->IsFunction()) { ASYNC_CALL(close, args[1], fd) } } #define ASYNC_CALL(func, callback, ...) br />eio_##func(After, cb_persist(callback));
11.
12.
主要提供文件I/O操作
13.
异步操作通过线程实现
14.
libeio仅依赖pthread,跨平台能力非常好
15.
16.
为什么不用libev实现异步文件操作? @爱多 对于Regular
File 来说,是不能够用采用 poll/epoll的,即O_NOBLOCK 方式对于传统文件句柄是无效的,也就是说我们的 open ,read, mkdir之类的Regular File操作必定会导致阻塞
17.
BAD CASE function
onFileB(err) { fs.readFile("c"); } function onFileA(err, data) { data += "blabla"; fs.writeFile ("b", data, onFileB); } fs.readFile ("a", onFileA);
18.
调用过程 主线程 poll
fs.readFile onFileA fs.readFile poll onFileB 新线程 read read
19.
代价 代码变得非常不直观 每个fs.readFile都发起一个线程
线程间context switch时代价很大 如果传递的是匿名函数,那么在执行前,函数的context会一直保存在内存中回调函数执行前资源(比如说数据库连接)不会被释放
20.
21.
conn.query();中有很多层嵌套时conn.close();将会推迟很久才执行
22.
23.
如果能够并行 varfilename =
“a”; async (function(){ vardata = fs.readFileSync (filename); data += "blabla"; fs.writeFileSync("b", data); fs.readFileSync("c"); }); console.log(“Main thread is in parallel”); 怎样实现async?
24.
25.
子进程的运行结果通过pipe传输node-fork
https://github.com/zcbenz/node-fork
26.
使用fork的问题 新进程相对昂贵 进程间传递javascript对象需要额外开销
不能传递函数 file destriptor会被复制,如果fork前程序已经在监听端口,子进程也将会监听同一个端口,产生竞争 V8引擎不允许多个线程同时使用V8的接口,所以不可能把多线程引入node
27.
Thank you