接收块如何工作?

Ban*_*shi 2 erlang

我只是有一个简单的问题,我似乎无法找到答案.基本上我的问题是,如果我有一个功能记录状态(递归),我发送多个消息,它会继续通过接收块,直到它的"邮箱"中不再有消息?

state(Fridge) ->
    receive
        Pat1 ->
            io:format("ok"),
            state(S);
        Pat2 ->
            io:format("not ok"),
            state(S)
    end.
Run Code Online (Sandbox Code Playgroud)

因此,如果我使用"!"向此过程发送3条消息(Pat1,Pat2,Pat1)并且它在接收消息之前无法进入其循环,它是否仍会打印出以下内容?

1> "ok"
2> "not ok"
3> "ok"
Run Code Online (Sandbox Code Playgroud)

对不起,如果不是很清楚,通过简化问题可能会很难描绘出我的要求.

Ste*_*ski 6

你的问题不明确,但你似乎在问这个过程是否会收到三条消息,即使它们是在目标进程调用之前发送的receive- 如果这是问题,答案是肯定的.当您向进程发送消息时,它会进入该进程的消息队列,直到进程调用receive将其从消息队列中删除并处理它.

如果您调用接收者的进程ID erlang:process_info(Pid, messages)在哪里Pid,您可以看到其队列中有哪些消息.您可以从Erlang shell中尝试这个.

作为消息排队的一个极端例子,在某些重负载条件下,如果接收器无法跟上快速发送器,它可能成为内存不足问题的根源.在这些条件下,接收者的消息队列可能会无限制地增长,直到系统内存不足.