Nodejs使用线程进行并行编程

时间:2016-05-16 11:40:08

标签: node.js multithreading meteor parallel-processing

我将nodejs用于CPU密集型任务,它基本上生成大量数据并将其存储在文件中。我将数据流式传输到输出文件,因为它是为单一类型的数据生成的。

目标:我想完成为多种类型的数据并行生成此数据的任务(利用我的多核cpu达到最佳状态)。没有每个进程都有自己的堆内存因此,提供更大的进程内存和更快的执行速度。

我计划使用节点fibersmeteor js也使用它来进行自己的回调处理。但我不确定这是否会达到我想要的效果,如{{3}之一3}}最后提到最终一切都是单线程的,节点光纤以某种方式管理相同的单线程事件循环以提供其功能。

所以,

  • 这是否意味着如果我使用节点光纤,我将无法执行任务 并行,因此没有使用我的CPU内核?

  • 节点video on meteor fibers by Chris Mather是否会帮助我实现目标 我想要的功能。正如模块主页上提到的那样 说,webworker线程将在单独/并行cpu上运行 过程,从而提供真正意义上的多线程??

  • 作为结束问题,这是否意味着不建议使用node.js. 这样的CPU密集型任务?

注意:我不想使用以线程形式呈现的异步代码结构库,但实际上只是在相同的异步代码上添加了合成糖,因为任务主要是CPU密集型的。我已经使用异步功能来最大化

//更新1(基于群集的答案)

抱歉,我忘记提及此问题,但我遇到的群集问题是:

  • 复杂地负载平衡我所拥有的工作量,以确保在某些其他任务之前执行特定的并行任务集。

  • 不确定群集是否真的符合我的要求,请参阅webworker-threads npm主页

  

“无法阻止事件循环”问题是Node的事件模型所固有的。无论您作为节点集群运行了多少个Node进程,它都无法解决CPU绑定任务的问题。

.....关于如何......的任何启示都会有所帮助。

1 个答案:

答案 0 :(得分:3)

您应该发现使用Node.js的多个进程要轻松得多,而不是尝试实现多个线程

例如,请参阅cluster模块。这使您可以在多个进程中轻松运行相同的js代码,例如每个核心一个,并收集他们的结果/一旦完成通知。

如果群集的功能超出了您的需要,那么您也可以直接拨打fork

如果必须具有线程并行性而不是进程 - 那么您可能需要查看编写async native模块。然后你可以访问libuv线程池(尽管可能会降低I / O性能),或者可以根据需要分叉你自己的线程(但是你可以自己与Node的其余部分同步)。

更新后1

对于负载平衡,如果群集不起作用,那么你可以用fork自己做,就像我提到的那样。群集源可用。

另一方面,这意味着如果任务真的受CPU约束,那么Node将无法提供其他技术,除非其他所有技术都使用Node,否则更简单。您唯一的选择是确保使用工作池将为您提供的所有可用CPU资源。如果您已经在使用Node,那么最简单的选项就是使用它已经拥有的(cluster或libuv)。如果它们还不够,那么你必须找到别的东西。

无论技术如何,多进程并行性比多线程并行性要容易得多。

注意:尽管你说的是,但你确实希望精确地使用异步代码,因为它是CPI密集型的,否则你的任务将阻止所有I / O.你不希望这种情况发生。