recursion - 我的消息传递示例有什么问题?
问题描述
我正在尝试从一个进程发送一条消息,该消息是我生成的另一个进程进行分配,我觉得我在这里非常接近,但我认为我的语法有点偏离:
-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
没有终止分号。if
您可以在表达式中看到这一点process1
:前两个子句以分号结尾,但第三个子句没有。 在
process2
中,打印如下消息:io:fwrite("~p~n", [Message])
由于
Message
是元组,而不是字符串,因此将其作为第一个参数传递给io:fwrite
会导致badarg
错误。让我们要求io:fwrite
为我们格式化它。process2
打印消息后可能应该调用自己。否则,它将收到一条消息然后退出。
所以现在你可以运行代码了,当它运行时你可以加载一个带有不同消息的新版本的模块(所谓的“热代码交换”)。这会改变正在打印的消息吗?为什么/为什么不?
它不会。
process1
对自身进行本地调用,这意味着它保留在旧版本的模块中。改为进行外部调用(明确指定模块:)assignment6:process1(N-1, Pid)
,它将切换到新版本。
推荐阅读
- node.js - 尝试在 Electron 桌面应用程序中使用 oauth 流(使用 spotify API)?
- ruby-on-rails - 如何在 bootstrap 的 svg 图标上使用 link_to 函数
- r - 如何使用 Loops 或 Lapply 从矩阵中生成 100 个新变量?
- node.js - 如何从另一个创建 POST localhost 的应用程序中侦听或获取 React 应用程序中的 json?
- javascript - 如何在android中将javascript localstorage.setItem注入webview?
- javascript - 如何使用 FormData() 从 React Js 向 Nodejs、MongoDB 发送对象数组?
- python - Python3 - 如何在 pygame 混音器中改变声音的音量
- python - TypeError:在Python中没有初始值的空序列的reduce()
- android - 如何从适配器获取上下文片段
- scala - Spark streaming 2.4.0 获取 org.apache.spark.sql.AnalysisException:找不到数据源:kafka