Concurrency 在Erlang中的两个进程之间交换消息
嗨,我在学习Erlang,在这个过程中,我试着做一些来自网络的练习。特别是我要做的问题是,我必须创建一个函数,它创建两个进程,向另一个进程发送m个消息,然后消亡。我遇到了问题,这是我的代码:Concurrency 在Erlang中的两个进程之间交换消息,concurrency,erlang,Concurrency,Erlang,嗨,我在学习Erlang,在这个过程中,我试着做一些来自网络的练习。特别是我要做的问题是,我必须创建一个函数,它创建两个进程,向另一个进程发送m个消息,然后消亡。我遇到了问题,这是我的代码: -module(roundtrip). -export([talk/1]). talk(M) -> init(M). init(M) -> P1 = start(M), P2 = start(M), P2 ! {P1, a_message}. myProc(
-module(roundtrip).
-export([talk/1]).
talk(M) ->
init(M).
init(M) ->
P1 = start(M),
P2 = start(M),
P2 ! {P1, a_message}.
myProc(M) ->
if M =:= 0 ->
io:format("Bye cruel world!~n")
end,
receive
{From, a_message} ->
From ! {self(), a_message},
myProc(M-1);
_ ->
io:format("I don't understand~n"),
myProc(M)
end.
start(M) ->
spawn(?MODULE, myProc, [M]).
当我调用talk时,我发现以下错误:
=错误报告===2013年11月11日::21:21:00===进程中的错误,退出值为:{undef,[{roundtrip,proc,“\n”,[]}
=错误报告===2013年11月11日::21:21:00===进程中的错误,退出值为:{undef,[{roundtrip,proc,“\n”,[]}
我正在四处寻找,但我不知道问题出在哪里
谢谢。您需要导出
myProc/1
功能。或者您可以使用spawn/1
:
start(M) ->
spawn(fun() -> myProc(M) end).
由于使用了
spawn/3
,因此需要导出myProc
另一个问题是当M=/=0
时,if条件不包括其他可能性。我会这样做:
-module(roundtrip).
-export([talk/1]).
talk(M) ->
init(M).
init(M) ->
P1 = start(M),
P2 = start(M),
P2 ! {P1, a_message}.
myProc(M) ->
case M of
0 ->
io:format("Bye cruel world!~n");
_ ->
receive
{From, a_message} ->
From ! {self(), a_message},
io:format("~p ~p~n", [self(), M]),
myProc(M-1);
_ ->
io:format("I don't understand~n"),
myProc(M)
end
end.
start(M) ->
spawn(fun() -> myProc(M) end).
请注意,我使用了
case
而不是if
和spawn/1
而不是spawn/3
您能解释一下,如果我使用spawn/3,为什么需要导出myProc吗?我想我需要导出我在模块外使用的任何东西。提前谢谢!执行spawn
会创建一个具有自己上下文的新进程,因此在该进程中,您不再在模块内部,也不再从“外部”调用函数。因此,它需要出口。