如何在calc函数中读取add(N)函数的返回值?

时间:2013-01-23 20:25:41

标签: erlang

我是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]). 

2 个答案:

答案 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.