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();
  1. Node.JS 本身是单线程的,eventLoop 也是单线程的,但是有些

    Node.JS 库不是单线程。比如  libuv 

  2.  libuv 负责处理操作系统相关的任务。 libuv 为了利用所有的CPU核,会创建一个由4个线程组成的线程池,来执行IO相关的操作。假设计算机有4个核的话,那个该线程池中的所有线程会被分别分配给那几个核。

  3. 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 流程图


上面两张图片结合来看就比较容易理解。


  1. 对于Node.JS的应用来说,每次client端发送的request是很多的,假设每个client发送一个request,那么这些request首先都会进入一个 event queue 事件队列,然后NodeJS的事件循环 Event Loop 会每次从队列中拿出一个事件进行处理,当没有blocking task 的时候,就直接返回response ,假设有blocking task 那就会调用 线程池中的线程对这些任务做处理(此时有可能是多线程的,根据线程池中的线程数不同而不同)。处理完之后会返回结果。

  2. 非NodeJS的web应用处理request的方式是“Multi-Threaded Request-Response” , 采用多线程并发处理客户端的请求

  3. 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问题

Nodejs深度探秘:event loop的本质和异步代码中的Zalgo问题

不要在nodejs中阻塞event loop

不要在nodejs中阻塞event loop

Nodejs Event Loop

我已经迷失在事件环(event-loop)中了Nodejs篇