0

以下は、best と呼ばれるメソッドから 3 つのプロセスを生成しようとしたプログラムです。すべてのプロセスからの応答を受け取り、それらをタプルに格納したいのですが、1 つの応答しか取得できません。

test() ->
    receive
     {From,N} -> From!{self(),N},
                 loop()
    end.

best(N) ->    
     Aid=spawn(fun t:loop/0),
     Aid ! {self(),N},
     Bid=spawn(fun t:loop/0),
     Bid ! {self(),N},
     Cid=spawn(fun t:loop/0),
     Cid ! {self(),N},
     receive 
        {Pid,Response} ->{Response}
     end.

誰かがこの問題で私を助けてくれますか

4

2 に答える 2

1
-module(wy).
-compile(export_all).

loop() ->
    Self = self(),
    receive 
    {From, Ref, N} ->
        From ! {Self, Ref, N * N}
    end.

receive_result(Ref) ->
    receive 
    {Pid, Ref, R} ->
        io:format("process ~p: ~p~n", [Pid, R]), 
        receive_result(Ref)
    after 10 ->
        ok
    end.
best() ->
    APid = spawn(fun loop/0),
    BPid = spawn(fun loop/0),
    CPid = spawn(fun loop/0),

    Self = self(),
    Ref  = make_ref(),
    APid ! {Self, Ref, 2},
    BPid ! {Self, Ref, 3},
    CPid ! {Self, Ref, 4},

    receive_result(Ref).

この小さなコードに従うことができます。結果は次のとおりです。

9> wy:best().
process <0.77.0>: 4
process <0.78.0>: 9
process <0.79.0>: 16
ok
于 2014-10-27T07:27:34.167 に答える
1

あなたの受信ブロックは、best/2 関数で、1 つのメッセージを受信するとすぐに終了します。このコードをシェルで起動すると、関数 flush() を使用して、他のメッセージがまだメッセージ キューにあることを確認できます。(投稿したコードには t:loop/0 関数がありません。N に基づいて何かを計算し、メッセージを介してスポナーに答えを返すと思います)

複数のメッセージを受信できるようにするには、受信ブロックを、すべての応答が得られるまで再帰的に呼び出す「ループ」に入れる必要があります。再帰ループがいつ終了したかを知ることができる変数を使用する必要があります (予想される回答の数、回答する必要があるプロセスのリストなど)。たとえば、リスト変数に回答を収集します。

于 2014-10-27T07:12:21.207 に答える