我的消息传递示例有什么问题?
What is wrong with my message passing example?
我正在尝试从我生成的一个进程向另一个进程发送消息以进行分配,我觉得我在这里非常接近,但我认为我的语法有点偏离:
-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
进行打印。
四件小事:
- 拼写为
receive
,而不是recieve
- 删除
process2
中的分号。 receive
表达式中的最后一个子句没有终止分号。您可以在 process1
中的 if
表达式中看到这一点:前两个子句以分号结尾,但第三个子句没有。
在process2
中打印如下消息:
io:fwrite("~p~n", [Message])
因为 Message
是一个元组,而不是字符串,将它作为第一个参数传递给 io:fwrite
会导致 badarg
错误。让我们请 io:fwrite
为我们格式化它。
process2
可能会在打印消息后调用自身。否则,它会收到一条消息然后退出。
所以现在您可以 运行 代码,并且在 运行ning 期间您可以加载带有不同消息的模块的新版本(所谓的 "hot code swapping")。这会改变正在打印的消息吗?为什么/为什么不?
不会。 process1
对自身进行 local 调用,这意味着它保留在模块的旧版本中。改为进行外部调用(显式指定模块:assignment6:process1(N-1, Pid)
),它将切换到新版本。
我正在尝试从我生成的一个进程向另一个进程发送消息以进行分配,我觉得我在这里非常接近,但我认为我的语法有点偏离:
-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
进行打印。
四件小事:
- 拼写为
receive
,而不是recieve
- 删除
process2
中的分号。receive
表达式中的最后一个子句没有终止分号。您可以在process1
中的if
表达式中看到这一点:前两个子句以分号结尾,但第三个子句没有。 在
process2
中打印如下消息:io:fwrite("~p~n", [Message])
因为
Message
是一个元组,而不是字符串,将它作为第一个参数传递给io:fwrite
会导致badarg
错误。让我们请io:fwrite
为我们格式化它。process2
可能会在打印消息后调用自身。否则,它会收到一条消息然后退出。
所以现在您可以 运行 代码,并且在 运行ning 期间您可以加载带有不同消息的模块的新版本(所谓的 "hot code swapping")。这会改变正在打印的消息吗?为什么/为什么不?
不会。
process1
对自身进行 local 调用,这意味着它保留在模块的旧版本中。改为进行外部调用(显式指定模块:assignment6:process1(N-1, Pid)
),它将切换到新版本。