我现在正在处理“过程! 消息”,但是在谷歌上搜索后,发现消息队列的大小仅限于内存。我有一个进程树,叶子节点生成消息并向根节点馈送,我需要限制队列或切换到其他方法来完成相同的工作。
此外,有时“过程”从一个叶子收到消息,有时从两个叶子收到。在第二种情况下,我需要为每个叶子使用不同的有限队列。
我现在正在处理“过程! 消息”,但是在谷歌上搜索后,发现消息队列的大小仅限于内存。我有一个进程树,叶子节点生成消息并向根节点馈送,我需要限制队列或切换到其他方法来完成相同的工作。
此外,有时“过程”从一个叶子收到消息,有时从两个叶子收到。在第二种情况下,我需要为每个叶子使用不同的有限队列。
对于进程的消息队列大小没有内置机制进行限制。
Erlang中通常解决这个问题的方法是在生产者和消费者之间引入流量控制协议。这可以简单地实现为发送者在发送下一条消息之前等待continue
回复。您可以发明更复杂的流量控制协议(如窗口划分等),但通常使用发送/等待回复就可以了。 gen_server:call/2
协议是一个很好的请求-响应协议,可以通过查看gen_server
和 gen:call
的代码来重用 - 它处理了可能出现的许多边缘情况。
另一种方法是通过系统拉取消息而非推送它们 - 在这种情况下,接收者会在准备好时向发送者请求消息。但是,如果您有无法限速或缓冲外部生产者,则可能没有这个选项。
Pid
。这在 erlang 消息中非常普遍,通常具有类似于 {SendingPid,Data}
的结构。这使得接收方可以通过在 receive
中使用模式匹配来选择要从哪个进程接收消息,并查看谁发送了消息。