我注意到“消息传递”的两种方法。我看到过Erlang使用的一种,另一个来自无stack python。据我了解,这是区别

ERLANG样式 - 消息将发送并排队到接收过程的邮箱中。从那里,它们以FIFO的方式删除。一旦第一个过程发送消息,就可以自由继续。

Python样式 - 处理A队列发送到ProcessB。B当前正在执行其他操作,因此A冻结了直到B可以接收到B。 B打开读取频道后,A发送数据,然后它们都继续。

现在,我看到Erlang方法的优点是您没有任何阻止过程。如果B永远无法接收,A仍然可以继续。但是,我在写的某些程序中注意到,由于消息流入大于流出,因此Erlang消息框有可能获得数百(或数千个)消息。

现在,我还没有在任何一种框架/语言上写大型程序,所以我想知道您对此的经历,如果这是我什至应该担心的话。

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

有帮助吗?

解决方案

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

  • 消费者将:发送消息,等待ACK,然后重复。
  • 生产者将:等待消息,在接收到消息时发送ACK,然后重复。

也可以将其倒置,生产商等待消费者来抓住下一条可用消息。

这些方法和其他流控制可以隐藏在功能后面,第一个方法大多已在 gen_server:call/2,3 反对 gen_server OTP行为过程。

我将异步消息传递到Erlang中,就像更好的方法一样,因为当潜伏期很高时,您可能非常想在计算机之间的消息传递时避免同步。然后,人们可以构成实施流控制的巧妙方法。说,要求生产者发送的每条n条消息中的消费者使用ACK,或者在收到此消息时发送特殊的“ ping我”,以便计算PING时间。

其他提示

从广义上讲,这是无限的队列与有限的队列。无堆栈通道可以被视为具有0尺寸的队列的特殊情况。

有限的队列倾向于僵局。两个线程/进程试图互相发送消息,均以完整的队列发送。

无限的队列具有更细微的失败。正如您提到的那样,大型邮箱将无法满足延迟要求。走得足够远,最终会溢出;没有无限记忆的东西,因此,它实际上只是一个有界的队列,并有一个巨大的限制,可以在满足过程中逐步中止该过程。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top