【问题标题】:Nodejs Parallel programming using threadsNodejs 使用线程进行并行编程
【发布时间】:2016-05-16 11:40:08
【问题描述】:

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

目标:我想完成为多种类型的数据并行生成这些数据的任务(充分利用我的多核 CPU)。没有每个进程都有自己的堆内存.从而提供更大的进程内存和更高的执行速度。

我计划使用节点fibersmeteor js 也使用它来处理自己的回调。但我不确定这是否能达到我想要的效果,就像在video on meteor fibers by Chris Mather 中提到的那样最终一切都是单线程的,节点纤程以某种方式管理相同的单线程事件循环以提供其功能。

所以,

  • 这是否意味着如果我使用节点光纤,我将不会在其中运行我的任务 并行,因此不使用我的 cpu 内核?

  • 节点webworker-threads 是否会帮助我实现 我想要的功能。正如模块主页上提到的那样 说,webworker 线程将在单独/并行 cpu 上运行 进程,从而提供真正意义上的多线程??

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

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

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

对不起,我忘了提这个,但我遇到的集群问题是:

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

  • 不确定集群是否真的做我想要的,参考these lines on webworker-threadsnpm主页

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

.....任何关于如何......会有帮助的提示。

【问题讨论】:

    标签: node.js multithreading meteor parallel-processing


    【解决方案1】:

    比起尝试实现多线程,您应该会发现在 Node.js 中使用多进程要容易得多

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

    如果集群做的比你需要的多,那么你也可以直接调用fork


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


    更新 1 后

    对于负载平衡,如果集群所做的对您不起作用,那么您可以使用 fork 自己完成,正如我所提到的。集群源可用。

    另一方面,这意味着如果任务确实受 CPU 限制,那么 Node 不会为您提供优于其他技术的优势,除了如果其他一切都使用 Node 会更简单。您唯一的选择是确保您使用所有可用的 CPU 资源,工作池将为您提供这些资源。如果您已经在使用 Node,那么最简单的选择是使用已有的(集群或 libuv)。如果它们还不够,那么是的,你必须找到其他东西。

    不管技术如何,多进程并行比多线程并行要容易得多。

    注意:不管你怎么说,你肯定想要使用异步代码,因为它是 CPI 密集型的,否则你的任务会阻塞所有 I/O。你不希望这种情况发生。

    【讨论】:

    • 这是否意味着与其他技术相比,没有任何库可以在 node.. 中提供多线程并行性
    • 有,但在许多人看来,这是一个非常糟糕的主意。 JavaScript 不是为此而设计的。
    • webworker-threads npm 模块怎么样 .. 我担心的一个问题是它所说的,集群仍然会导致节点事件循环变慢并且不会帮助加快速度..?
    • 一些一般性建议:在您测试了确切的用例之前,不要相信任何人关于性能的言论。如果您的服务器坐在那里,其中 1 个核心 100% 且 15 个核心什么都不做,并且您的所有 I/O 都在等待数据,我很确定您会看到加速。
    • 所以我会更好地使用集群而不是多线程......你在说什么?
    猜你喜欢
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 2017-03-18
    • 2019-04-02
    • 2017-11-23
    • 1970-01-01
    • 2021-12-17
    相关资源
    最近更新 更多