在 Erlang w/o 可伸缩性牺牲中执行计算密集型任务的最佳方法是什么?

What is the best way of doing computationally intensive tasks in Erlang w/o scalability sacrifices?

Erlang Interoperability 指南讨论了不同的互操作性机制。这是我的结论:

一些人提倡使用 OpenCL,基本上是将需要大量资源的计算委托给 GPU,同时让 Erlang 模拟器拥有 CPU。这听起来很棒,但是您需要您的服务器配备合适的 GPU。

使用 JInterface 并与为每个请求生成线程的 Java 进程通信可能是一种选择。

那么有没有人遇到过经过实践测试并证明效果很好的解决方案?

实际上所有的解决方案都发生了。由于我一直与他们中的一些人紧密合作,我可以说以下内容:

  • 端口安全但端口通信速度慢。如果端口崩溃,VM 继续工作。如果您没有广泛地与您的端口通信或者您不信任该端口 - 这是您的选择

  • NIF 非常快。如果您的数据流很大,您应该使用它们。当然它们是不安全的,所以你必须仔细编写 NIF 库,你最好学习一些 C(大多数 NIF 创建者都跳过这一点)。实际上,特定模式很容易解决调度问题。您应该在从 Erlang 接收到数据并从 Erlang 线程分离处理后立即启动执行实际工作的新 C 线程。所以你很快就退出了 NIF 函数,返回到 Erlang 并等待来自 C 代码的消息。

  • Java节点或C节点是指可以完全移动到节点的任务。那是一些又长又重的工作。

牢记以上注意事项,您可以决定最适合您任务的方式。