一个完整的 node.js事件循环流程
node.js事件循环
Client 请求到达 node api,该请求被添加到Event Queue(事件队列)。这是因为Node.js 无法同时处理多个请求。
Event Loop(事件循环) 始终检查 Event Queue 中是否有待处理事件,如果有就从 Event Queue 中从前到后依次取出,然后提供服务。
Event Loop 是单线程非阻塞I/O,它会把请求发送给 C++ Thread Pool(线程池)去处理,底层是基于C++ Libuv 异步I/O模型结构可以支持高并发。
现在 C++ Thread Pool有大量的请求,如数据库请求,文件请求等。
任何线程完成任务时,Callback(回调函数)就会被触发,并将响应发送给 Event Loop。
最终 Event Loop 会将请求返回给 Client。
node js实现多线程锁
// 线程锁
let isLock = false;
let lockList = [];
async function lock() {
function unlock() {
let waitFunc = lockList.shift();
if (waitFunc) {
waitFunc.resolve(unlock);
} else {
isLock = false;
if (isLock) {
return new Promise((resolve, reject) => {
lockList.push({ resolve, reject });
} else {
isLock = true;
return unlock;