10

我注意到两种“消息传递”的方法。一种我见过 Erlang 的使用,另一种来自 Stackless Python。据我了解,这就是区别

Erlang Style - 消息被发送并排队到接收进程的邮箱中。从那里他们以先进先出的方式被移除。一旦第一个进程发送消息,它就可以自由地继续。

Python 风格 - 进程 A 排队等待发送到进程 B。B 当前正在执行一些其他操作,因此 A 被冻结,直到 B 准备好接收。一旦 B 打开读取通道,A 发送数据,然后它们都继续。

现在我看到 Erlang 方法的优点是你没有任何阻塞的进程。如果 B 永远无法接收,A 仍然可以继续。但是我注意到在我编写的一些程序中,Erlang 消息框可能会充满数百(或数千)条消息,因为消息的流入量大于流出量。

现在我还没有用任何一种框架/语言编写过大型程序,所以我想知道你的经验是否与此有关,如果这是我什至应该担心的事情。

是的,我知道这是抽象的,但我也在寻找相当抽象的答案。

4

2 回答 2

8

我在 Erlang 编程中的经验是,当您期望较高的消息传递速率(即生产者比消费者更快)时,您可以添加自己的流控制。一个简单的场景

  • 消费者将:发送消息,等待确认,然后重复。
  • 生产者将:等待消息,收到并处理消息后发送确认,然后重复。

也可以反转它,生产者等待消费者来获取下 N 个可用消息。

这些方法和其他流控制可以隐藏在函数后面,第一个大部分已经在gen_server:call/2,3OTPgen_server行为过程中可用。

我认为 Erlang 中的异步消息传递是更好的方法,因为当延迟很高时,您可能非常希望在计算机之间进行消息传递时避免同步。然后可以组合巧妙的方法来实现流控制。比如说,对于生产者发送给它的每 N 条消息,要求消费者确认,或者不时发送一个特殊的“当你收到这条消息时 ping 我”消息,以计算 ping 时间。

于 2010-02-10T21:29:16.177 回答
4

从广义上讲,这是无界队列与有界队列。无堆栈通道可以被认为是大小为 0 的队列的一种特殊情况。

有界队列有死锁的趋势。两个线程/进程试图互相发送消息,都有一个完整的队列。

无界队列有更微妙的失败。正如您所提到的,大型邮箱无法满足延迟要求。走得够远,最终会溢出;没有无限内存这样的东西,所以它实际上只是一个有界队列,有一个巨大的限制,当满时会中止进程。

哪个最好?这很难说。这里没有简单的答案。

于 2010-02-10T20:34:40.250 回答