Erlang Interoperability指南讨论了不同的互操作性机制。这里是我的结论:在Erlang W/o可伸缩性牺牲中进行计算密集型任务的最佳方式是什么?
端口和Erl_Interface程序:操作系统调度,限制可伸缩性。
端口驱动程序:危险,因为端口驱动程序崩溃导致 模拟程序也下降。
C节点:节点服务器需要扩展以及Erlang应用程序以避免 的可扩展性牺牲。
NIF:Loic总和 他们很好。
一些人主张使用OpenCL,基本上将资源耗费的计算委托给GPU,同时让Erlang仿真器拥有CPU。这听起来很棒,但是你需要在你的服务器上安装合适的GPU。
使用JInterface并与为每个请求产生线程的Java进程进行通信可能是一个选项。
那么有没有人遇到过一个在实践中已经过测试的解决方案,而且结果很好?
您链接到的NIF的描述看起来过时并且不准确。例如,在调度器上运行的NIF“超过几微秒”不会导致问题;只有在NIF运行超过几毫秒时才会发生这种情况。此外,['enif_schedule_nif'函数](http://www.erlang.org/doc/man/erl_nif.html#enif_schedule_nif)提供了一个很好的方法来分解长NIF以避免调度程序问题,再加上实验[dirty调度程序功能](http://www.erlang.org/doc/man/erl_nif.html#dirty_nifs)NIF可以在不引起调度程序打嗝的情况下运行。 –
要使用脏调度程序功能,您需要构建启用了实验性脏调度程序支持的模拟程序。我不认为运行具有实验功能的生产代码的想法会有许多爱好者。一般来说,NIF似乎有点危险。正如Loic所指出的那样,他们可能会让虚拟机崩溃编译在Windows下使用它们的库是一场噩梦 - 我不喜欢在Windows上运行Erlang。 – coolfeature
实验性的脏调度器功能有一天会成为一个常规功能,希望在Erlang 19中。我实现了Erlang/OTP的脏调度程序功能,并且启用了它的所有Erlang 17和18 VM,并且没有任何问题。此外,请参阅[这些度量](https://medium.com/@jlouis666/erlang-dirty-scheduler-overhead-6e1219dcc7),其中显示将进程切换到脏调度程序所涉及的少量开销。 –