0

私は Erlang を初めて使用します。add 関数を実行する 2 つのプロセスを生成し、2 つの数値を追加する必要があります。プロセス1と2の割り当てられた値はプロセスIDを示しています。値をキャッチする必要があります。

関数で add(N) 関数の戻り値を読み取るにはどうすればよいcalcですか?

-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]). 
4

2 に答える 2

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.
于 2013-01-23T20:42:43.547 に答える
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.
于 2013-01-23T21:17:01.963 に答える