0

以下是我尝试在其中生成 3 个进程的程序,形成一种称为最佳的方法。我想接收来自所有进程的响应并将它们存储在一个元组中,但我只能得到一个响应。

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

您的接收块,在 best/2 函数中,在收到一条消息后立即退出。如果您在 shell 中启动此代码,您可以使用函数 flush() 验证其他消息是否仍在消息队列中。(您发布的代码缺少 t:loop/0 函数,我猜它会根据 N 计算一些东西并通过消息将答案返回给生成器)

为了能够接收多条消息,您必须将接收块放入一个“循环”中,该循环会递归调用自身,直到它得到所有答案。您将必须使用一个变量,该变量允许递归循环知道它何时完成(预期答案的数量,应该回答的进程列表......)并在列表变量中收集答案。

于 2014-10-27T07:12:21.207 回答
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 回答