首页 > 解决方案 > 消息传递时 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])).

标签: erlang

解决方案


如果你得到一个badargfrom main ! Message,就意味着没有进程注册在这个名字下main。它要么没有开始或没有正确注册,要么在某个时候已经死亡。您可以添加更多打印语句来跟踪发生的情况。

您可以使用erlang:registered/2查看已注册的内容。


推荐阅读