一个Node.js线程是否阻止另一个节点



使用Node.js和一个CPU虚拟实例,如果我将一个工作线程和一个Web线程放在同一个节点上,一个会阻止另一个吗?我是否需要两个 CPU 才能完美并行运行?

是的,如果它都是同步代码,则会阻止另一个。

由于您只有一个虚拟 CPU 实例(假设不是超线程(,因此在核心级别,CPU 仅以同步方式获取指令:1,然后是 2,然后是 3,然后是 4。

因此,从理论上讲,如果一个工人有这样的东西,它会阻止:

while (true) {
    doSomething();
}

免责声明:我不确定操作系统内核是否会处理有关阻塞指令的任何内容。

但是,Node.js 运行事件循环中的所有 I/O,以及您明确声明要在事件循环中运行的任务(process.nextTick()setTimeout() ...(。事件循环的工作方式在这里得到了很好的解释,所以我不会详细介绍 - 但是,关于 Node.js 的唯一阻塞部分是同步运行代码,如上面的例子。

所以,长话短说:由于您的 Web worker 使用 Node.js,并且 http 模块是异步模块,因此您的 Web worker 不会阻塞。由于您的工作线程也使用 Node.js,假设它执行在事件发生(例如访问您的网站(时启动的代码,因此它不会阻塞。

要完美地并行运行同步代码,您需要两个 CPU。但是,假设它是异步的,它应该可以在一个 CPU 上正常工作

相关内容

最新更新