一个Node.js线程阻塞另一个吗?

时间:2014-12-05 03:48:11

标签: node.js

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

1 个答案:

答案 0 :(得分:0)

是的,如果它是所有同步代码,就会阻止另一个

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

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

while (true) {
    doSomething();
}

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

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

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

要完美地并行运行同步代码,您需要两个CPU。但是,假设它是异步的,它应该在一个CPU上运行就好