Erlang中的空进程邮箱

Posted

技术标签:

【中文标题】Erlang中的空进程邮箱【英文标题】:Empty Process Mail box in Erlang 【发布时间】:2012-08-12 22:45:06 【问题描述】:

当你向 shell 进程发送消息时,你可以通过调用:c:flush(). 来刷新所有消息

C:\Windows\System32>erl Eshell V5.9(使用 ^G 中止) 1>自我()!乔希。 乔希 2>自我()!我。 我 3> 自我()!你。 你 4> 冲洗()。 壳牌得到了乔什 壳牌得到了我 壳牌得到你 好的 5>

在我看来,这清空了shell进程的邮箱。 清空任何erlang进程邮箱的等效方法是什么?

【问题讨论】:

【参考方案1】:

这个函数应该刷新邮箱中的所有消息(在你调用它的任何进程中):

flush() ->
        receive
                _ -> flush()
        after
                0 -> ok
        end.

【讨论】:

谢谢@stemm。我想知道:after 0 -> ok 不是立即强制进程退出receive 吗?请问您对此有何参考? 据我了解(并在实践中检查),此功能将接收所有现有消息,而邮箱不为空。我在 Francesco Cesarini 的书 Erlang Programming(第 4 段 - 关于并行编程)中阅读了这个技巧 是的,after 0 -> 保证会在“超时”之前尝试匹配邮箱中的所有邮件。它比after 1 -> 更有效,因为实际上不会启动计时器;不需要。

以上是关于Erlang中的空进程邮箱的主要内容,如果未能解决你的问题,请参考以下文章

其他语言的 Erlang 风格并发

在 Erlang 中作为进程生成的函数内部定义的函数

在 Erlang 中将消息路由到 PID

从技术上讲,为啥 Erlang 中的进程比 OS 线程更高效?

Erlang 语言中的进程与并发

Erlang 中的进程平衡