gpt4 book ai didi

erlang - 为什么第二次调用 receive 没有在 Erlang shell 中检索消息?

转载 作者:行者123 更新时间:2023-12-04 01:33:25 25 4
gpt4 key购买 nike

我正在玩弄 Erlang 中的进程并尝试创建一个简单的计数器进程。它接收发送者的 PID,增加内部计数器并将新的计数器值发送给发送者。我正在从 erl shell(Erlang/OTP 20、Eshell V9.2)启动我的代码。而且我能够成功地收到来自计数器进程的第一个回复,但不是第二个。

%% Process function that serves as a counter
CounterFun = fun() ->
(fun Receiver(Current) ->
io:format(" -- Entering receiver, current ~p~n", [Current]),
receive
Sender ->
New = Current + 1,
io:format(" -- Sending ~p to ~p~n", [New, Sender]),
Sender ! New,
Receiver(New)
end
end)(0)
end.

CounterPid = spawn(CounterFun).

CounterPid ! self().
receive V -> V after 3000 -> timeout end. % Will provide 1

CounterPid ! self().
receive V -> V after 3000 -> timeout end. % Will result in timeout

这是它在我的控制台中的样子。 enter image description here

最佳答案

第一次接收将变量V绑定(bind)到1,所以第二次接收变成:

receive 
1 -> ...

end

并且,由于消息 1 从未到达,第二次接收超时。超时后,你可以在shell中调用flush(),你会看到邮箱里有一条消息2。您还可以随时调用 b() 以显示当前变量及其值(称为绑定(bind))——在执行第一次接收后尝试这样做。

在您的函数中,您还在接收中的接收中进行递归接收,以便第一个接收永远不会结束。为了证明这一点,您可以在后面加上打印语句:

Receiver(New)

喜欢:

io:format("receive ending with Current= ~w~n", [Current])

你永远不会看到任何输出。您应该将接收更改为如下所示:

New = Currrent + 1
receive
Sender ->
io:format(" -- Sending ~p to ~p~n", [New, Sender]),
Sender ! New,
io:format("receive ending with Current= ~w~n", [Current])
end,
counter(New).

关于erlang - 为什么第二次调用 receive 没有在 Erlang shell 中检索消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60386783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com