我想编写创建2个进程的程序。 第一个打印编号,将其发送到第二个进程,依此类推。 但是我的启动功能有问题。
-module(zad).
-export([start/0, one/0, two/0]).
one() ->
receive
{go1, N} ->
io:format("1 ~w~n", [N]),
two ! {go2, N+1},
one();
{go2, 50} ->
io:format("END ~w~n", [N+1]),
two ! finished
end.
two() ->
receive
finished ->
io:format("two finished~n", []);
{go2, N} ->
io:format("2 ~w~n", [N]),
one ! {go1, N+1 },
two()
end.
start() ->
register(two, spawn(zad, two, [])),
register(one, spawn(zad, one, [])),
one ! {go1, 0}.
这是错误
** exception error: bad argument
in function register/2
called as register(two,<0.146.0>)
in call from zad:start/0 (zad.erl, line 29)
这是否意味着我无法在启动时注册2个进程?这段代码有什么问题?
更新 这真的很奇怪。但在我改变之后
{go2, 50} -> io:format("END ~w~n", [N+1]),
到
{go2, 50} -> io:format("END ~w~n", [50]),
错误消失了。
这很奇怪,因为问题在one()
,但错误在register(two)
答案 0 :(得分:2)
您可以在start/0
中注册两个流程。这意味着您传入register/2
的值是错误的。从文档(http://erlang.org/doc/man/erlang.html#register-2):
故障:
badarg
如果PidOrPort不是现有的本地进程或端口。badarg
如果RegName已被使用。badarg
如果进程或端口已注册(已有名称)。badarg
如果RegName是原子undefined
。
可能发生的事情是在调用register/2
之前该过程已经死亡(请参阅上面列表中的第一个失败)。