众所周知,Node.js是单线程的。Node.js的大部分是用JavaScript编写的,其他部分则是用C ++编写的。
Node.js使用我们在浏览器环境中熟悉的事件循环和调用堆栈的相同概念,这意味着Node.js的JavaScript部分只能是单线程的,但是我们发现需要与操作系统对话的低级任务不是单线程的。
我们使用libuv来讲解,当Node.js将调用libuv识别为针时,它将此任务委托给libuv。在操作中,libuv的某些库需要线程,因此在执行Node.js程序时使用线程池。
默认情况下,libuv提供的Node.js线程池中有四个线程。我们可以通过process.env.UV_THREADPOOL_SIZE在脚本顶部调用来增加或减少该线程池。
看来,一旦我们调用代码创建文件,Node.js就会到达其代码的libuv部分,这将为该任务分配一个线程。libuv中的此部分在处理文件之前会获取有关磁盘的一些统计信息。
此统计检查可能需要一段时间才能完成,因此,线程将被释放以执行其他一些任务,直到完成统计检查为止。检查完成后,libuv节点将占用可用线程,或者等待直到某个线程变为可用线程为止。
我们只有四个可以调用的线程,因此有足够多的线程可以循环使用,唯一的问题是每个线程将以多快的速度处理其任务。我们注意到,进入线程池的第一个代码将首先返回其结果,并且在运行其代码时会阻塞所有其他线程,所以我们需要做的任务是处理Node.js输出与返回的时间处理。
Node.js低级任务被委派给其他程序时可以做多线程任务
领取专属 10元无门槛券
私享最新 技术干货