Parallel processing 捕获主管函数中的badarg错误
这里我有一个程序,可以做一些简单的数学运算。该程序由一名主管运行 然而,有时程序在我运行时会崩溃。特别是当我第一次运行Parallel processing 捕获主管函数中的badarg错误,parallel-processing,erlang,Parallel Processing,Erlang,这里我有一个程序,可以做一些简单的数学运算。该程序由一名主管运行 然而,有时程序在我运行时会崩溃。特别是当我第一次运行calc\u sup\u start\u link()时,然后有时运行calc\u test()。有人知道吗?计划如下: calc_sup_start_link() -> spawn_link(fun calc_sup/0). calc_sup() -> process_flag(trap_exit, true), {ok, _Pid} = calc_
calc\u sup\u start\u link()
时,然后有时运行calc\u test()
。有人知道吗?计划如下:
calc_sup_start_link() ->
spawn_link(fun calc_sup/0).
calc_sup() ->
process_flag(trap_exit, true),
{ok, _Pid} = calc_start_link(),
receive
{'EXIT', _From, normal} ->
ok;
{'EXIT', _From, _Reason} ->
calc_sup() % Crash: restart
end.
calc_start_link() ->
S = spawn_link(fun calc_loop/0),
register(calc, S),
{ok, S}
calc_loop() ->
receive
{add, P, A, B} ->
P ! {add_reply, A + B},
calc_loop();
{mul, P, A, B} ->
{_, _, N} = now(),
if N rem 5 =/= 0 -> ok end,
P ! {mul_reply, A * B},
calc_loop()
end.
calc_add(A, B) ->
calc ! {add, self(), A, B},
receive
{add_reply, C} -> C
end.
calc_mul(A, B) ->
calc ! {mul, self(), A, B},
receive
{mul_reply, C} -> C
end.
calc_client(X, Y, Z) ->
Q = calc_mul(X, Y),
timer:sleep(500),
R = calc_add(Q, 3),
timer:sleep(500),
calc_mul(R, Z).
calc_test() ->
io:format("Running calc_client(2, 4, 5)~n"),
R = calc_client(2, 4, 5),
io:format("calc_client(2, 4, 5) returned ~p~n", [R]).
我认为它在这个集团中崩溃了:
calc_loop() ->
receive
{add, P, A, B} ->
P ! {add_reply, A + B},
calc_loop();
{mul, P, A, B} ->
{_, _, N} = now(),
if N rem 5 =/= 0 -> ok end, %% if doesn't work as in C or java !!!
P ! {mul_reply, A * B},
calc_loop()
end.
事实上,如果N是5的倍数,(nREM5)==0,并且没有分支来计算if的结果,那么在erlang中,所有语句都必须返回一个值。您可以在shell中验证:
1> if ((11 rem 5) =/= 0) -> ok end.
ok
2> if ((10 rem 5) =/= 0) -> ok end.
** exception error: no true branch found when evaluating an if expression
3> if ((10 rem 5) =/= 0) -> ok; true -> false end.
false
4>
在你的情况下,你应该写:
calc_loop() ->
receive
{add, P, A, B} ->
P ! {add_reply, A + B},
calc_loop();
{mul, P, A, B} ->
{_, _, N} = now(),
case (N rem 5) of
0 -> P ! {mul_reply, A * B},
calc_loop();
_ -> ok
end
end.
如果N是5的倍数,这将执行乘法和循环;在其他情况下(我不确定这是否是您想要做的,因为if表达式不完整)如果您自己编写尾部递归, 更好的方法是始终调用外部函数(对于代码,只在内存中保存两个版本) 像这样: 将calc_loop()更改为?模块:calc_loop() 它将始终调用最新版本的代码
您是否可以添加完整的错误信息,包括堆栈跟踪到您的问题?@ USER 212973考虑学习这样的代码降价。你现在正在做额外的工作,结果更糟