为什么第二次呼叫接收不';在Erlang shell中检索不到消息?

为什么第二次呼叫接收不';在Erlang shell中检索不到消息?,erlang,erlang-shell,Erlang,Erlang Shell,我正在玩Erlang中的进程,并试图创建一个简单的计数器进程。 它接收发送方的PID,增加内部计数器,并向发送方发送新的计数器值。 我将从erlshell(Erlang/otp20,eshellv9.2)启动我的代码。 我能够成功地从计数器进程接收到第一个回复,但不能接收第二个 %%用作计数器的进程函数 CounterFun=fun()-> (娱乐接收器(当前)-> io:格式(“--输入接收器,当前~p~n”,[current]), 接收 发件人-> 新=当前+1, io:格式(“--Send

我正在玩Erlang中的进程,并试图创建一个简单的计数器进程。 它接收发送方的PID,增加内部计数器,并向发送方发送新的计数器值。 我将从erlshell(Erlang/otp20,eshellv9.2)启动我的代码。 我能够成功地从计数器进程接收到第一个回复,但不能接收第二个

%%用作计数器的进程函数
CounterFun=fun()->
(娱乐接收器(当前)->
io:格式(“--输入接收器,当前~p~n”,[current]),
接收
发件人->
新=当前+1,
io:格式(“--Sending~p to~p~n”,[New,Sender]),
发送者!新的,
接收器(新)
结束
(完)(0)
结束。
CounterPid=spawn(counterpun)。
反对!self()。
3000->超时结束后接收V->V.%将提供1
反对!self()。
3000->超时结束后接收V->V.%将导致超时
这是我的控制台的外观。
第一次接收将变量
V
绑定到
1
,因此第二次接收变为:

receive 
    1 -> ...

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

在函数中,您还可以在receive中的receive中执行递归receive,这样第一次接收就永远不会结束。为了证明这一点,您可以将打印语句放在以下内容之后:

Receiver(New)
比如:

你永远不会看到任何输出。您应该将receive更改为以下内容:

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).
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).