在 Erlang w/o 可伸缩性牺牲中执行计算密集型任务的最佳方法是什么?
What is the best way of doing computationally intensive tasks in Erlang w/o scalability sacrifices?
Erlang Interoperability 指南讨论了不同的互操作性机制。这是我的结论:
端口和 Erl_Interface 程序:OS 计划,限制可扩展性。
端口驱动程序:危险,因为端口驱动程序崩溃会导致
模拟器也down了。
C 节点:节点服务器需要像 Erlang 应用程序一样扩展以避免
可扩展性牺牲。
NIF:Loic 总和
他们很好。
一些人提倡使用 OpenCL,基本上是将需要大量资源的计算委托给 GPU,同时让 Erlang 模拟器拥有 CPU。这听起来很棒,但是您需要您的服务器配备合适的 GPU。
使用 JInterface 并与为每个请求生成线程的 Java 进程通信可能是一种选择。
那么有没有人遇到过经过实践测试并证明效果很好的解决方案?
实际上所有的解决方案都发生了。由于我一直与他们中的一些人紧密合作,我可以说以下内容:
端口安全但端口通信速度慢。如果端口崩溃,VM 继续工作。如果您没有广泛地与您的端口通信或者您不信任该端口 - 这是您的选择
NIF 非常快。如果您的数据流很大,您应该使用它们。当然它们是不安全的,所以你必须仔细编写 NIF 库,你最好学习一些 C(大多数 NIF 创建者都跳过这一点)。实际上,特定模式很容易解决调度问题。您应该在从 Erlang 接收到数据并从 Erlang 线程分离处理后立即启动执行实际工作的新 C 线程。所以你很快就退出了 NIF 函数,返回到 Erlang 并等待来自 C 代码的消息。
Java节点或C节点是指可以完全移动到节点的任务。那是一些又长又重的工作。
牢记以上注意事项,您可以决定最适合您任务的方式。
Erlang Interoperability 指南讨论了不同的互操作性机制。这是我的结论:
端口和 Erl_Interface 程序:OS 计划,限制可扩展性。
端口驱动程序:危险,因为端口驱动程序崩溃会导致 模拟器也down了。
C 节点:节点服务器需要像 Erlang 应用程序一样扩展以避免 可扩展性牺牲。
NIF:Loic 总和 他们很好。
一些人提倡使用 OpenCL,基本上是将需要大量资源的计算委托给 GPU,同时让 Erlang 模拟器拥有 CPU。这听起来很棒,但是您需要您的服务器配备合适的 GPU。
使用 JInterface 并与为每个请求生成线程的 Java 进程通信可能是一种选择。
那么有没有人遇到过经过实践测试并证明效果很好的解决方案?
实际上所有的解决方案都发生了。由于我一直与他们中的一些人紧密合作,我可以说以下内容:
端口安全但端口通信速度慢。如果端口崩溃,VM 继续工作。如果您没有广泛地与您的端口通信或者您不信任该端口 - 这是您的选择
NIF 非常快。如果您的数据流很大,您应该使用它们。当然它们是不安全的,所以你必须仔细编写 NIF 库,你最好学习一些 C(大多数 NIF 创建者都跳过这一点)。实际上,特定模式很容易解决调度问题。您应该在从 Erlang 接收到数据并从 Erlang 线程分离处理后立即启动执行实际工作的新 C 线程。所以你很快就退出了 NIF 函数,返回到 Erlang 并等待来自 C 代码的消息。
Java节点或C节点是指可以完全移动到节点的任务。那是一些又长又重的工作。
牢记以上注意事项,您可以决定最适合您任务的方式。