erlang - 消息传递时 Erlang 处理“badarg”错误
问题描述
我是 Erlang 的新手,并试图通过消息传递将从一个函数获得的结果传递给另一个函数,但我不确定为什么当我这样做时它会给我 badarg 错误,即 main !{数字, 1, 100}。我尝试进行一些更改,如灰色部分所示,但使用 From 时消息未通过。这是我的代码:
-module(numbers).
-export([start_main/0,main/2,proc/0,sumNumbers/2]).
main(Total, N) ->
if
N == 0 ->
io:format("Total: ~p ~n", [Total]);
true ->
true
end,
receive
{numbers, Low, High} ->
Half = round(High/2),
Pid1 = spawn(numbers, proc, []),
Pid2 = spawn(numbers, proc, []),
Pid1 ! {work, Low, Half},
Pid2 ! {work, Half+1, High};
%% Pid1 ! {work, self(), Low, Half},
%% Pid2 ! {work, self(), Half+1, High},
{return, Result} ->
io:format("Received ~p ~n", [Result]),
main(Total+Result, N-1)
end.
proc() ->
receive
{work, Low, High} ->
io:format("Processing ~p to ~p ~n", [Low, High]),
Res = sumNumbers(Low,High),
main ! {return, Res},
proc()
%% {work, From, Low, High} ->
%% io:format("Processing ~p to ~p ~n", [Low, High]),
%% Res = sumNumbers(Low,High),
%% From ! {return, Res},
%% proc()
end.
sumNumbers(Low, High) ->
Lst = lists:seq(Low,High),
lists:sum(Lst).
start_main() ->
register(main, spawn(numbers, main, [0,2])).
解决方案
如果你得到一个badarg
from main ! Message
,就意味着没有进程注册在这个名字下main
。它要么没有开始或没有正确注册,要么在某个时候已经死亡。您可以添加更多打印语句来跟踪发生的情况。
您可以使用erlang:registered/2
查看已注册的内容。
推荐阅读
- angular - 带有嵌套组件的 Angularr *ngFor
- python - Selenium Python 按钮未单击且未出现错误
- java - FileWriter 没有向文件中写入任何内容
- tensorflow - 具有自定义损失函数的 TensorFlow 2.4 行为:无法将符号 Keras 输入/输出转换为 numpy 数组
- javascript - 光滑的滑块/轮播:允许滚动而不
- javascript - 用属性分配对象或分配给属性有什么区别?
- mongodb - 如何使用 MongoDB 聚合获得总和?
- java - 什么是仅用于 reding 输入的 getResourceAsStream(),如何编写输出
- python - AWS Lambda:可以使用 Python 用户输入吗?
- awk - 比较条件行重复并在 AWK 中打印特定总和的程序