[フレーム]
PPTX, PDF1,323 views

Nodejs异步原理和缺陷 - 赵成

本文讨论了Node.js中的异步编程原理及其局限性,介绍了uv、libev和libeio的异步I/O实现方法。文中还分析了使用这些库时所遇到的问题以及使用同步I/O和多线程的复杂性。最后提出了一些解决方案,如使用fork来实现并行操作,但也说明了其带来的开销和竞争问题。

Embed presentation

Downloaded 80 times
node.js异步:原理和缺陷赵成@小型笨蛋
node.jsutilhttphttpsfsJavascript模块......bufferchild_processfilenetC模块......V8解析器事件库uvlibeiolibev
主要内容异步接口的实现uv,libev,以及libeio存在的问题
异步的实现方式Synchronous I/O Multiplexingselect,pselect,poll,epoll,kqueue,libev线程模拟glibcaio,libeioKernel Native AIO,以及Windows Overlapped I/O前者问题多多,比如仅支持 O_DIRECT 方式来对磁盘读写后者用于在uv中实现Windows的异步I/O在Linux下,node.js靠libev和libeio配合使用来实现异步I/O
事件驱动的一个例子var net = require('net');var server = net.createServer(function (socket) {socket.write("Echo server\r\n");socket.pipe(socket);});server.listen(1337, "127.0.0.1");static Handle<Value> Connect(constArguments&) { ...uv_tcp_connect(..., AfterConnect); ...}
uvThis is the new networking layer for Node. Its purpose is to abstract IOCP on windows and libev on Unix systems. We intend to eventually contain all platform differences in this libraryuv是node的网络实现层
*nix下uv是对libev的封装
主要目的是实现Windows版本的node什么是libevlibev是一个事件驱动库,提供高性能事件循环
主要用于事件驱动的网络编程调用流程Server.listen (1337); listener();TCPWrap::Listen (arguments);OnConnection();listen(tcp->fd, backlog);ev_io_set(..., fd, EV_READ);accept(...);connection_cb();返回有新连接主循环主线程
另一个例子: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, ...) \eio_##func(After, cb_persist(callback));
什么是libeio Libeio is a full-featured asynchronous I/O library for C, modelled in similar style and spirit as libev. Features include: asynchronous read, write, open, close, stat, unlink, fdatasync, mknod, readdir etc.libeio为C提供异步版本的POSIX API
主要提供文件I/O操作
异步操作通过线程实现
libeio仅依赖pthread,跨平台能力非常好
可以和任何事件库配合使用,比如libevlibeio做了什么fs.close (fd, callback);callback ();Close (arguments);After ();close结束后eio_poll ();eio_close (fd, ..., After);主线程close (fd);新线程
为什么不用libev实现异步文件操作?@爱多对于Regular File 来说,是不能够用采用 poll/epoll的,即O_NOBLOCK 方式对于传统文件句柄是无效的,也就是说我们的 open ,read, mkdir之类的Regular File操作必定会导致阻塞
BAD CASEfunction onFileB(err) {fs.readFile("c");}function onFileA(err, data) { data += "blabla";fs.writeFile ("b", data, onFileB);}fs.readFile ("a", onFileA);
调用过程主线程pollfs.readFileonFileAfs.readFilepollonFileB新线程readread
代价代码变得非常不直观每个fs.readFile都发起一个线程线程间context switch时代价很大如果传递的是匿名函数,那么在执行前,函数的context会一直保存在内存中回调函数执行前资源(比如说数据库连接)不会被释放
BAD CASE 2var conn = db.connect(...);conn.query(‘SELECT * FROM table’, function(err) { ...conn.close();});conn.close();只能在主线程中执行

More Related Content

Nodejs异步的原理和缺陷
PPTX
Nodejs异步的原理和缺陷
Ceph中国社区9.19 Ceph IO 路径 和性能分析-王豪迈05
PDF
Ceph中国社区9.19 Ceph IO 路径 和性能分析-王豪迈05
About Thrift
PPTX
About Thrift
iOS开发常用库推荐之一@techparty
PDF
iOS开发常用库推荐之一@techparty
不一樣的Web server... coServ
PDF
不一樣的Web server... coServ
Node.js 淺談socket.io
PDF
Node.js 淺談socket.io
學好 node.js 不可不知的事
PDF
學好 node.js 不可不知的事
Blend4web研究--代码结构
PPTX
Blend4web研究--代码结构
Nodejs异步的原理和缺陷
Nodejs异步的原理和缺陷
Ceph中国社区9.19 Ceph IO 路径 和性能分析-王豪迈05
Ceph中国社区9.19 Ceph IO 路径 和性能分析-王豪迈05
About Thrift
About Thrift
iOS开发常用库推荐之一@techparty
iOS开发常用库推荐之一@techparty
不一樣的Web server... coServ
不一樣的Web server... coServ
Node.js 淺談socket.io
Node.js 淺談socket.io
學好 node.js 不可不知的事
學好 node.js 不可不知的事
Blend4web研究--代码结构
Blend4web研究--代码结构

More from Jackson Tian

D2_node在淘宝的应用实践_pdf版
PDF
D2_node在淘宝的应用实践_pdf版
D2_Node在淘宝的应用实践
KEY
D2_Node在淘宝的应用实践
(C)NodeJS
PDF
(C)NodeJS
Mobile webapp&v5 html5_min
PDF
Mobile webapp&v5 html5_min
EventProxy introduction - JacksonTian
PDF
EventProxy introduction - JacksonTian
Mongoskin - Guilin
PDF
Mongoskin - Guilin
MobileWebAppFramework_V5_design
PDF
MobileWebAppFramework_V5_design
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
PDF
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
Why Nodejs Guilin Shanghai
PDF
Why Nodejs Guilin Shanghai
NodeJS快速服务端开发 朝沐金风 Shanghai
PPT
NodeJS快速服务端开发 朝沐金风 Shanghai
Ruby vs Node ShiningRay Shanghai
PPT
Ruby vs Node ShiningRay Shanghai
Browser vs. Node.js Jackson Tian Shanghai
PDF
Browser vs. Node.js Jackson Tian Shanghai
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版
D2_Node在淘宝的应用实践
D2_Node在淘宝的应用实践
(C)NodeJS
(C)NodeJS
Mobile webapp&v5 html5_min
Mobile webapp&v5 html5_min
EventProxy introduction - JacksonTian
EventProxy introduction - JacksonTian
Mongoskin - Guilin
Mongoskin - Guilin
MobileWebAppFramework_V5_design
MobileWebAppFramework_V5_design
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
Why Nodejs Guilin Shanghai
Why Nodejs Guilin Shanghai
NodeJS快速服务端开发 朝沐金风 Shanghai
NodeJS快速服务端开发 朝沐金风 Shanghai
Ruby vs Node ShiningRay Shanghai
Ruby vs Node ShiningRay Shanghai
Browser vs. Node.js Jackson Tian Shanghai
Browser vs. Node.js Jackson Tian Shanghai

Nodejs异步原理和缺陷 - 赵成

AltStyle によって変換されたページ (->オリジナル) /