Node.js事件循环
Node.js I/O事件循环是单线程还是多线程Node.js事件循环,node.js,loops,events,Node.js,Loops,Events,Node.js I/O事件循环是单线程还是多线程 若我有几个I/O进程,node会将它们放在一个外部事件循环中。它们是按顺序处理的(最快的优先)还是处理事件循环以同时处理它们(…以及在哪些限制中) 事件循环 Node.js事件循环在单个线程下运行,这意味着您编写的应用程序代码在单个线程上进行计算。Nodejs本身通过libuv使用许多线程,但在编写Nodejs代码时,您永远不必处理这些线程 每个涉及I/O调用的调用都需要注册回调。此调用也会立即返回,这允许您并行执行多个IO操作,而无需在应用程序
若我有几个I/O进程,node会将它们放在一个外部事件循环中。它们是按顺序处理的(最快的优先)还是处理事件循环以同时处理它们(…以及在哪些限制中) 事件循环 Node.js事件循环在单个线程下运行,这意味着您编写的应用程序代码在单个线程上进行计算。Nodejs本身通过libuv使用许多线程,但在编写Nodejs代码时,您永远不必处理这些线程
每个涉及I/O调用的调用都需要注册回调。此调用也会立即返回,这允许您并行执行多个IO操作,而无需在应用程序代码中使用线程。一旦I/O操作完成,它的回调将被推送到事件循环上。它将在执行之前在事件循环上推送的所有其他回调都被执行时立即执行 有几种方法可以对如何将回调添加到事件循环进行基本操作。 通常你不应该需要这些,但有时它们会很有用
sync
变体,因为这些方法也会锁定事件循环
如果你想做CPU密集型的事情,你应该把它委托给一个不同的进程,这个进程可以更有效地执行CPU绑定的操作,或者你可以把它作为一个进程来写
控制流
为了管理编写许多回调,您可能需要使用控制流库。
我相信这是目前最流行的基于回调的库:
- v8 javascript运行时引擎
- libuv用于handlign非i/o阻塞操作,并为您处理线程和并发操作
让fs=require('fs');
fs.stat('path',(err,stat)=>{
//用统计数据做点什么;
console.log('second');
});
console.log('first')代码>要理解事件中的nodejs I/O事件,必须正确理解nodejs事件循环
从名称event loop中,我们了解到它是一个循环,在循环中循环运行一个又一个循环,直到循环中没有事件或应用程序关闭为止
事件循环是nodejs中最重要的特性之一,它是nodejs中异步编程的基础
当程序启动时,我们处于事件循环运行的单线程中的节点进程中。现在我们最重要的事情
const fs = require('fs');
setTimeout(()=>console.log('Timer 1 finished'), 0);
fs.readFile('test-file.txt', ()=>{
console.log('I/O finished');
});
setImmediate(()=>console.log('Immediate 1 finished'))
console.log('Hello from the top level code');
const fs = require('fs');
setTimeout(()=>console.log('Timer 1 finished'), 0);
setImmediate(()=>console.log('Immediate 1 finished'));
fs.readFile('test-file.txt', ()=>{
console.log('I/O finished');
setTimeout(()=>console.log('Timer 2 finished'), 0);
setImmediate(()=>console.log('Immediate 2 finished'));
setTimeout(()=>console.log('Timer 3 finished'), 0);
setImmediate(()=>console.log('Immediate 3 finished'));
});
console.log('Hello from the top level code')
setTimeout(()=>console.log('Timer 1 finished'), 0);
setImmediate(()=>console.log('Immediate 1 finished'));
fs.readFile('test-file.txt', ()=>{
console.log('I/O finished');
setTimeout(()=>console.log('Timer 2 finished'), 3000);
setImmediate(()=>console.log('Immediate 2 finished'));
setTimeout(()=>console.log('Timer 3 finished'), 0);
setImmediate(()=>console.log('Immediate 3 finished'));
});
console.log('Hello from the top level code')
setTimeout(()=>console.log('Timer 1 finished'), 0);
setImmediate(()=>console.log('Immediate 1 finished'));
fs.readFile('test-file.txt', ()=>{
console.log('I/O finished');
setTimeout(()=>console.log('Timer 2 finished'), 3000);
setImmediate(()=>console.log('Immediate 2 finished'));
setTimeout(()=>console.log('Timer 3 finished'), 0);
setImmediate(()=>console.log('Immediate 3 finished'));
process.nextTick(()=>console.log('Process Next Tick'));
});
console.log('Hello from the top level code')
console.log('starting')
setTimeout(()=>{
console.log('0sec')
}, 0)
setTimeout(()=>{
console.log('2sec')
}, 2000)
console.log('end')
starting
0sec
end
2sec
starting
end
0sec
2sec