使用Node.js和一个单独的CPU虚拟实例,如果我将工作线程和Web线程放在同一节点上,会阻止另一个吗?我需要两个CPU才能并行运行吗?
答案 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上运行就好。