【问题标题】:Handling CPU intensive computations in a Node.js application在 Node.js 应用程序中处理 CPU 密集型计算
【发布时间】:2014-03-10 06:43:28
【问题描述】:

我有一个 Node.js 网络应用程序,我需要在其中对大型矩阵进行一些繁重的计算。由于 Node.js 是事件驱动的,我预计这将导致我的 Web 应用程序性能不佳。使用 Node 处理 CPU 繁重任务的最佳方法是什么?

我可以将计算卸载到另一个用 Python 等构建的服务器上吗?

【问题讨论】:

  • 请注意,Python 确实没有那么高效。与 C++ 相比,在某些情况下您可能会获得 100 倍的改进,尤其是计算。
  • 对,如果我采用这个解决方案,Mu 计划在 python 中实现他的服务器!但在 NumPy/SciPy 中进行矩阵计算。
  • 我正在使用 SciPyPython 编写物理模拟,我的任务是用 C++ 重写它。在那之后,由于 C/C++long double,我设法获得了大约 80 倍的速度提升和 1000 多倍的准确度提升。所以我认为用 C++ 编写它是值得的。
  • 好的,这是有道理的。谢谢您的帮助。不幸的是,我不懂 C++。理想情况下,我想使用我更熟悉的东西,比如 Python。

标签: node.js


【解决方案1】:

在这种情况下,您真正​​想做的是 Addon

Addons 如 Node.js 文档中所述,是动态链接的共享对象。它们可以为 C 和 C++ 库提供胶水。

因此,无论 V8 多么强大,您都可以使用较低级别的语言 (C/C++) 编写繁重的计算,并且比使用 JavaScript 更高效.

阅读有关如何使用 Addons 的文档,我相信您会发现它是 NodeJS 的一个很棒的功能。

【讨论】:

  • 我认为这是一个比我更好的答案,除非可能是因为我个人并不真正了解 C/C++。上次我不得不做类似的事情时,公司已经有了我需要用 Java 构建的所有例程......所以使用 exec 似乎是一个更好的主意。
  • 我之前使用过 NodeJS 以及一些用 C++ 编写的附加内容,它运行良好,速度也非常快。顺便说一句,C++ 并不复杂。事实上,虽然我现在开始使用高级语言进行编程,但我主要使用 C++。
  • 对 - 我知道 C++ 并不复杂(我确实在我的一些 comp-sci 课程中学习过),但问题是当你必须告诉你的经理你为什么需要将一些存在了五年并且非常稳定的代码重写为一种新的语言。那种谈话不太顺利 :D 但是,我仍然同意,如果你有能力,这是一个更好的方法。
  • @Stephen,你为什么说他的回答更好?即使您使用插件,C++ 代码仍然会阻塞节点,不是吗?将工作卸载到另一台服务器将使该过程真正异步。 (我真的不知道,我只是想知道)
【解决方案2】:

是的 - 您可以卸载到另一台服务器。只需使用您的正常请求方法发布您需要“计算”的数据。由于请求是异步的,因此不会阻塞 Node 的正常流程。当请求返回时,您就获得了所需的数据,并且可以在将其发送给客户端之前进行最后一分钟的更改。

然后您可以拥有一个“服务器场”来处理这些事情 - 例如,您可以在 EC2 上创建一个负载均衡器,然后让节点向该均衡器发出请求。无需在节点内部做任何花哨的事情,比如记住哪个服务器是最后一次命中或类似的事情。

或者,如果这更多是命令行的事情并且不需要非常可扩展,您可以使用节点的 exec 进行系统调用,然后再次调用回调,无论返回是什么。

无论您做什么,都不要在节点内部进行这些计算 :) - 您的预期是正确的。它会炸毁你的表现,因为我已经经历了几次艰难的学习。异步是你的朋友。

【讨论】:

    猜你喜欢
    • 2022-01-13
    • 2011-04-11
    • 2015-05-19
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多