据说可以产生数千个进程来同时执行类似的任务,而Erlang善于处理它。如果还有更多的工作要做,我们可以简单安全地添加更多的工作流程,并使其具有可扩展性。
我无法理解的是,如果每项工作所执行的工作本身就是资源密集型的,那么Erlang将如何处理它呢?例如,如果条目由多个源构成一个表,并且一个Erlang应用程序使用其数百个进程从表中读取行并执行某些操作,这显然可能会导致资源负担。每个工人都会尝试从表中提取记录。 如果这是一个错误的示例,请考虑一个必须在内存中执行高CPU密集型计算的工作程序。成千上万的这类工人同时运行会使CPU过度工作。
请纠正我对Erlang中可伸缩性的理解: 只有在有可用的工作时,Erlang进程才会获得CPU的时间片。另一方面,OS进程获得时间片,而不管它们是否空闲。 Erlang进程的启动和关闭时间远低于OS进程。
除了以上两点之外,还有一些关于Erlang的东西可以扩展吗?
谢谢, 梅尔文
答案 0 :(得分:3)
在Erlang中扩展不是自动的。 Erlang语言和运行时提供了一些工具,使编写并发程序变得相对容易。如果这些是正确编写的,那么它们可以沿着几个不同的维度进行缩放:
最大的优势是Erlang进程是孤立的,就像操作系统一样,但与操作系统不同,通信开销很小。这两个特性是你想在Erlang编程中利用的。
如果您要定位高并行执行,那么您需要避免使用具有高度争用的数据资源的问题。解决问题的最佳方法是将问题分开,以免发生。
我有一篇博客文章http://jlouisramblings.blogspot.dk/2013/01/how-erlang-does-scheduling.html,其中详细介绍了Erlang调度程序的工作原理。你可能想读一下。