1

据说可以产生数千个进程同时执行类似的任务,而 Erlang 擅长处理它。如果还有更多工作要做,我们可以简单安全地添加更多工作进程,这使其具有可扩展性。

我不明白的是,如果每个工作执行的工作本身就是资源密集型的,那么 Erlang 将如何处理它?例如,如果多个来源正在将条目写入表中,并且具有数百个进程的 Erlang 应用程序从表中读取行并执行某些操作,这显然可能会造成资源负担。每个工人都会尝试从表中拉出一条记录。如果这是一个不好的例子,请考虑一个必须在内存中执行高度 CPU 密集型计算的工作人员。数以千计的此类工作线程同时运行会使 CPU 过度工作。

请纠正我对 Erlang 可扩展性的理解:Erlang 进程只有在有可用工作时才能获得 CPU 的时间片。另一方面,无论它们是否空闲,操作系统进程都会获得时间片。Erlang 进程的启动和关闭时间远低于 OS 进程。

除了以上两点之外,Erlang 是否有一些东西使它具有可扩展性?

谢谢,梅尔文

4

1 回答 1

3

Erlang 中的缩放不是自动的。Erlang 语言和运行时提供了一些工具,使编写并发程序相对容易。如果这些写得正确,那么它们就能够沿着几个不同的维度进行缩放:

  • 在多个内核上并行执行 - 因为 VM 知道要全部利用它们。
  • 容量 - 因为您可以为每个任务设置一个流程,并且它们很轻。

最大的优点是 Erlang 进程是隔离的,就像在 OS 中一样,但与 OS 不同的是,通信开销很小。这两个特征是你想在 Erlang 编程中利用的。

如果您的目标是高并行执行,那么您拥有高度竞争的数据资源的问题是需要避免的。解决它的最好方法是将你的问题分开,这样它就不会发生。

我有一篇博文http://jlouisramblings.blogspot.dk/2013/01/how-erlang-does-scheduling.html更详细地描述了 Erlang 调度程序的工作原理。你可能想读一下。

于 2013-09-22T13:24:22.463 回答