Weitere ähnliche Inhalte Ähnlich wie Nodejs异步的原理和缺陷 (20) Nodejs异步的原理和缺陷2. node.js util http https fs Javascript模块 …… buffer child_process file net C模块 …… V8解析器 事件库 uv libeio libev 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); ... } 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)); 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 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?