NodeJS - Event Loop 模型
Posted 陈两岁的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NodeJS - Event Loop 模型相关的知识,希望对你有一定的参考价值。
最近想要深入了解一下Node.JS,关于它是单线程还是多线程的讨论很感兴趣,所以搜索了很多资料,现做一些总结整理。
//process.env.UV_THREADPOOL_SIZE=5; 可以通过更改size改变线程个数
const crypto = require("crypto");
const start = Date.now();
function logHashTime() {
crypto.pbkdf2("a", "b", 100000, 512, "sha512", () => {
console.log("Hash: ", Date.now() - start);
});
}
logHashTime();
logHashTime();
logHashTime();
logHashTime();
Node.JS 本身是单线程的,eventLoop 也是单线程的,但是有些
Node.JS 库不是单线程。比如 libuv
libuv 负责处理操作系统相关的任务。 libuv 为了利用所有的CPU核,会创建一个由4个线程组成的线程池,来执行IO相关的操作。假设计算机有4个核的话,那个该线程池中的所有线程会被分别分配给那几个核。
Node.JS 是单线程的,但是具体执行过程中由于用到了 libuv 这个库,底层调用操作系统的逻辑还是用 thread pool的, 所以假设你自己的电脑是CPU 4 核,当你调用 5 次 logHashTime()的时候,实际上是把前4 个logHashTime() 都分配给 4 个核,然后等某个thread 释放之后,调用最后一个logHashTime()。 所以看起来程序运行的时候仍然是多线程的,但是要知道 Node.JS 本身是单线程的。
[参考文章]
[1]https://medium.com/better-programming/is-node-js-really-single-threaded-7ea59bcc8d64
l
非Node.JS web应用的 Multi-Threaded Request Response Stateless Model
NodeJS Single Thread Event Loop 流程图
上面两张图片结合来看就比较容易理解。
对于Node.JS的应用来说,每次client端发送的request是很多的,假设每个client发送一个request,那么这些request首先都会进入一个 event queue 事件队列,然后NodeJS的事件循环 Event Loop 会每次从队列中拿出一个事件进行处理,当没有blocking task 的时候,就直接返回response ,假设有blocking task 那就会调用 线程池中的线程对这些任务做处理(此时有可能是多线程的,根据线程池中的线程数不同而不同)。处理完之后会返回结果。
非NodeJS的web应用处理request的方式是“Multi-Threaded Request-Response” , 采用多线程并发处理客户端的请求
NodeJS 采用的是 “Single Threaded with Event Loop Model”
[参考文章]
[1]https://www.journaldev.com/7462/node-js-architecture-single-threaded-event-loop
[2]https://itnext.io/multi-threading-and-multi-process-in-node-js-ffa5bb5cde98
以上是关于NodeJS - Event Loop 模型的主要内容,如果未能解决你的问题,请参考以下文章
Nodejs深度探秘:event loop的本质和异步代码中的Zalgo问题