我正在尝试从一个进程发送一条消息,然后将其发送给另一个进程进行分配,我觉得我离这里很近,但是我认为我的语法有点不对:
-module(assignment6).
-export([start/1, process1/2, process2/0, send_message/2]).
process1(N, Pid) ->
Message = "This is the original Message",
if
N == 1 ->
timer:sleep(3000),
send_message(Pid, Message);
N > 1 ->
timer:sleep(3000),
send_message(Pid, Message),
process1(N-1, Pid);
true ->
io:fwrite("Negative/0, Int/Floating-Point Numbers not allowed")
end.
process2() ->
recieve
Message ->
io:fwrite(Message),
io:fwrite("~n");
end.
send_message(Pid, Message) ->
Pid ! {Message}.
start(N) ->
Pid = spawn(assignment6, process2, []),
spawn(assignment6, process1, [N, Pid]).
该程序的目标是在启动该功能时将消息打印N次,但会延迟足够长的时间,以便我可以在运行中热交换消息的措词。我只是不太想将邮件发送到process2
进行打印。
答案 0 :(得分:2)
四件小事:
receive
,而不是recieve
process2
中的分号。 receive
表达式中的最后一个子句没有终止分号。您可以在if
的{{1}}表达式中看到这一点:前两个子句以分号结尾,而第三个子句不以分号结尾。在process1
中,打印如下消息:
process2
由于io:fwrite("~p~n", [Message])
是一个元组而不是字符串,将其作为第一个参数传递给Message
会导致io:fwrite
错误。让我们要求badarg
为我们格式化它。
io:fwrite
在打印消息后应该会自行调用。否则,它将收到一条消息,然后退出。因此,现在您可以运行代码,并且在运行时,您可以使用不同的消息加载模块的新版本(即所谓的“热代码交换”)。这会改变正在打印的消息吗?为什么/为什么不呢?
不会。
process2
对自身进行 local 调用,这意味着它停留在模块的旧版本中。改为进行外部呼叫(明确指定模块:process1
),它将切换到新版本。