Thread Pool

435 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情

前言

今天要学习的是Thread Pool,一个新的概念。希望我可以将这个概念描述明白!

Processes、Threads and the Thread Pool

我们都知道javascript是单线程的,而Node也具有单线程这样的特性(Node的开发者最初想写一个基于事件驱动、非阻塞I/O的服务器,而Javascript的特性正好符合他的要求)。对于单线程程序,最害怕的莫过于阻塞线程。如果一个有很多用户的网站,所有的操作都是同步的,那么如果一个用户读取较大的文件,那么其他的用户在这个时候都不能进行操作,这是一个可怕的后果。

大家应该知道Javascript通过事件循环(Event Loop)来解决这个问题(如果不知道也没关系,会在下一节讲述)。但是同时还有一个名为线程池的东西在这里发挥作用。

事件循环在执行的过程中,对于一些过于"heavy"的操作,会发生Offload work from the event loop,也就是将事件循环中的东西放到线程池中。

image.png

那么什么样的操作算是heavy的呢?例如:File system APIsCryptographyCompressionDNS lookups等都会放入线程池中解决。

Node默认情况下线程池有四个Thread,但是我们也可以通过下面操作改变Thread数。

process.env.UV_THREADPOOL_SIZE = 1;

上面的代码就可以将线程池中的Thread数改为1。

那么如果线程池中有4个Thread,同时间有五个heavy操作该怎么办呢?这时候第五个操作就会在queue中等待Thread空闲。

通过这样的机制就可以防止线程阻塞啦~

后记

虽然上面的解释看起来十分的合理,因为接受了主流的观点。但是仍有许多深层次的东西需要理解。比如Thread pool到底具体在什么时候用到。stack overflow有相关的问题——node.js - When is the thread pool used? - Stack Overflow。还需要理解理解再丰富内容。