使用 Erlang 消息传递在模拟中表示并发电梯

Representing concurrent elevators in a simulation using Erlang Message passing

我知道这不是一个理想的问题,但我会尽力解释它:)

首先,场景是我的任务是创建一个具有多部电梯的建筑物的模拟。

假设我的建筑物由 2 到 5 部电梯和任意数量的楼层组成。这里的目标是让 "People" 登上电梯并前往不同的楼层。

这里的重点是运行每台电梯并发

我已经设法在 C++ 中为每个电梯使用一个线程来完成此操作。我正在努力做的是想出一种简单的方法来使用 Erlang 中的消息传递来做到这一点。我不是要代码答案,而是要解释我如何使用消息传递来解决这个问题。我当然尝试阅读有关该主题的信息,但它让我感到困惑。

到目前为止,我了解到线程必须通过相互传递消息来进行通信。非常感谢任何帮助澄清这方面的方法。这不是评分作业或任何东西,是我知识的练习。

最后一个问题: 如何使用消息传递(在 Erlang 中)对具有多个编程为独立运行的电梯的建筑物进行建模。

Instead of maintaining a shared state, you give each process its own state, and if anything changes you send messages with the update (and associated data) to all relevant processes

大牛所说的进程是Erlang进程,不是线程。它们可能看起来像线程,但它们至少与它们的相似之处一样不同......所以最好称它们为进程。

在设计 Erlang 解决方案时,您需要注意不要带着 C 的思维定式。 Erlang 的要点是它是一个不同的范例,虽然 Erlang 本身是用 C 实现的,因此你在 Erlang 中所做的一切最终 运行 在 C 线程中,重要的是在很大程度上忘记这一点并使用 Erlang 范例相反。

在 C 中,有些东西需要管理,它们很狡猾,当你不仔细观察它们时,它们会咬你。 Erlang 进程非常棒,您可以出于所有意图和目的生成无限数量的进程,而且它们实际上不需要任何照料。

在您的电梯场景中,正如 Daniel 所说,为每个电梯生成一个进程是一个合理的设计。使用 Erlang 需要考虑的一件事是,在这种情况下,数字并不重要,一旦你编写了一个模块来模拟你的电梯,你就可以生成 2 到 5 个,或者 2 到 500 万个,然后你通常发现与 Erlang 的区别很小。

我并不是说你不能设计一个有问题的实现,但老实说,一旦你习惯了 Erlang,你会发现它确实有助于快速开发,没有通常的并行和并发陷阱。

随着你的电梯场景的进展,推进它的正确方法是了解 OTP,为你的电梯使用类似 gen_server 的东西,并由主管动态(或不动态地)生成它们从中。如果您的电梯发生故障,该过程将自动获得 replaced/restarted。这类似于电梯发生故障(进程停止;电梯不可用),维修工程师来修理它(进程重新启动;电梯再次可用)。电梯发生故障时,电梯里的人会发生什么事可能是一个更高级的话题,对此有一些可能的解决方案。