掌握 Erlang 消息
Getting to grips with Erlang messages
我仍在尝试处理 Erlang 消息,在玩弄它的过程中,我想到了这个案例。看起来它应该工作,但它只是无限期地挂起。
更习惯 Erlang 的人可以解释一下我做错了什么吗?是的,我知道我什至不看返回的内容。这是尝试减少代码以隔离问题的结果。
-module(test).
-export([caller/2]).
callee(V1, V2, From) ->
From ! {V1, V2}.
caller(V1, V2) ->
spawn(fun() ->
callee(V1, V2, self()) end),
receive
_ ->
{V1, V2}
end.
如果您将 self()
的结果赋值给一个 在 调用 spawn
的函数之外的变量,然后传入该变量而不是文字 self()
那么在 callee
中发送的消息将正确地发送到进程 运行 caller
(等待 receive
的进程)。
这一点将帮助您了解问题出在哪里。
1> Self = self(), spawn(fun() -> io:format("Self: ~p, self():~p ~n", [Self, self()]) end).
Self: <0.83.0>, self():<0.85.0>
<0.85.0>
我仍在尝试处理 Erlang 消息,在玩弄它的过程中,我想到了这个案例。看起来它应该工作,但它只是无限期地挂起。
更习惯 Erlang 的人可以解释一下我做错了什么吗?是的,我知道我什至不看返回的内容。这是尝试减少代码以隔离问题的结果。
-module(test).
-export([caller/2]).
callee(V1, V2, From) ->
From ! {V1, V2}.
caller(V1, V2) ->
spawn(fun() ->
callee(V1, V2, self()) end),
receive
_ ->
{V1, V2}
end.
如果您将 self()
的结果赋值给一个 在 调用 spawn
的函数之外的变量,然后传入该变量而不是文字 self()
那么在 callee
中发送的消息将正确地发送到进程 运行 caller
(等待 receive
的进程)。
这一点将帮助您了解问题出在哪里。
1> Self = self(), spawn(fun() -> io:format("Self: ~p, self():~p ~n", [Self, self()]) end).
Self: <0.83.0>, self():<0.85.0>
<0.85.0>