Erlang - 如何限制消息队列或模拟它?

6

我现在正在处理“过程! 消息”,但是在谷歌上搜索后,发现消息队列的大小仅限于内存。我有一个进程树,叶子节点生成消息并向根节点馈送,我需要限制队列或切换到其他方法来完成相同的工作。

此外,有时“过程”从一个叶子收到消息,有时从两个叶子收到。在第二种情况下,我需要为每个叶子使用不同的有限队列。

3个回答

10

对于进程的消息队列大小没有内置机制进行限制。

Erlang中通常解决这个问题的方法是在生产者和消费者之间引入流量控制协议。这可以简单地实现为发送者在发送下一条消息之前等待continue回复。您可以发明更复杂的流量控制协议(如窗口划分等),但通常使用发送/等待回复就可以了。 gen_server:call/2 协议是一个很好的请求-响应协议,可以通过查看gen_servergen:call 的代码来重用 - 它处理了可能出现的许多边缘情况。

另一种方法是通过系统拉取消息而非推送它们 - 在这种情况下,接收者会在准备好时向发送者请求消息。但是,如果您有无法限速或缓冲外部生产者,则可能没有这个选项。


2

1
处理第二种情况的传统方式是在消息中包含发送进程的 Pid。这在 erlang 消息中非常普遍,通常具有类似于 {SendingPid,Data} 的结构。这使得接收方可以通过在 receive 中使用模式匹配来选择要从哪个进程接收消息,并查看谁发送了消息。
这就是 erlang 如何在一个消息队列中复用来自许多不同发送方的消息,并不被迫在所有地方处理所有可能的消息的方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接