线程池如何使用以及何时使用:
首先,当我们在计算机上使用/安装Node时,它将在其他进程中启动一个进程,该进程在计算机中称为节点进程,并且一直运行直到您杀死它。这个运行过程就是我们所谓的单线程。
因此,单线程机制很容易阻止节点应用程序,但这是Node.js带到表中的独特功能之一。因此,再次运行节点应用程序,它将仅在单个线程中运行。无论您有1个或1百万个用户同时访问您的应用程序。
因此,让我们确切地了解启动节点应用程序时在nodejs单线程中会发生什么。首先,程序被初始化,然后执行所有顶级代码,这意味着所有不在任何回调函数内的代码(请记住,所有回调函数内的所有代码都将在事件循环下执行)。
之后,执行的所有模块代码然后注册所有回调,最后,为您的应用程序启动事件循环。
因此,正如我们之前讨论的那样,所有回调函数和这些函数中的代码将在事件循环下执行。在事件循环中,负载分布在不同的阶段。无论如何,我不会在这里讨论事件循环。
为了更好地理解线程池,我想请您想象一下,在事件循环中,一个回调函数内部的代码在完成另一个回调函数内部的代码执行之后才执行,现在如果有些任务实际上太繁琐了。然后,它们将阻塞我们的nodejs单线程。因此,这就是线程池进入的地方,就像事件循环一样,由libuv库提供给Node.js。
因此,线程池不是nodejs本身的一部分,它是libuv提供的,用于将繁重的工作分担给libuv,libuv将在其自己的线程中执行这些代码,并且libuv将在执行后将结果返回给事件循环。
线程池为我们提供了四个额外的线程,这些线程与主单线程完全分开。实际上,我们最多可以配置128个线程。
因此,所有这些线程一起形成了一个线程池。然后事件循环可以自动将繁重的任务卸载到线程池中。
有趣的是,所有这些都是在幕后自动发生的。决定什么去线程池,什么不去线程,不是我们的开发人员来决定的。
有很多任务转到线程池,例如
-> All operations dealing with files
->Everyting is related to cryptography, like caching passwords.
->All compression stuff
->DNS lookups