Erlang产卵过程

时间:2014-10-27 06:18:42

标签: erlang erlang-shell

以下是我试图从一个名为best的方法产生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.

有人可以帮我解决这个问题吗

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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