我是Erlang的新手,我需要生成两个运行add函数的进程,然后添加 两个数字。 过程一和二的赋值显示了进程ID,我需要捕获值。
如何在calc
函数中读取add(N)函数的返回值?
-module(myerl).
-export([calc/1,add/1]).
add(N) ->
N + 5.
calc(L)
pone = spawn( fun() -> add(A) end),
ptwo = spawn( fun() -> add(B) end),
Result = Pone + Ptwo,
io:format("result ~p~n", [Result]).
答案 0 :(得分:3)
您需要使用消息传递。您必须使用结果将消息发送回调用进程。 spawn
函数向新生成的进程返回一个PID(进程标识符),而不是执行结果。
这个例子可以做你期望的事情:
calc(A, B) ->
Self = self(), % The spawned funs need a Pid to send to, use a closure
POne = spawn(fun() -> Self ! {self(), add(A)} end),
PTwo = spawn(fun() -> Self ! {self(), add(B)} end),
wait_for_response(POne, PTwo, 0).
wait_for_response(undefined, undefined, Sum) ->
Sum;
wait_for_response(POne, PTwo, Sum) ->
receive
{POne, V} -> wait_for_response(undefined, PTwo, Sum + V);
{PTwo, V} -> wait_for_response(POne, undefined, Sum + V)
end.
答案 1 :(得分:2)
@Soup d'Campbells的解释很好。我本能地做了一些略微不同的事情,以玩具的方式预测了孩子们的过程中的一些不良行为。另外,我允许输入是一个数字列表,而不仅仅是2。
-module(myerl).
-export([calc/1, add/1]).
calc(NumList) when is_list(NumList)->
Parent = self(),
_Pids = [spawn(fun()-> Parent ! add(ANum) end) || ANum <- NumList],
collect(length(NumList), 0);
calc(_) ->
{error, badarg}.
collect(0, Sum) ->
Sum;
collect(Cnt, Sum) ->
receive
N when is_number(N) ->
collect(Cnt-1, Sum + N);
_Bad -> % returned something that isnt a number
collect(Cnt-1, Sum)
after 1000 -> % died or is too slow
collect(Cnt-1, Sum)
end.
add(N) ->
N + 5.