Erlan*卵过程

问题描述:

以下是我试图从最好的方法中产生3个过程的程序。我想从所有进程接收响应并将它们存储在一个元组中,但我只能得到一个响应。Erlan*卵过程

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. 

可有人请尽快帮我这个probem

+0

产卵多个进程我用这种方法http://*.com/a/20573151/49197 – 2014-10-27 09:16:59

+0

的函数名称为试验(+),我认为它应该是环() – abcd 2015-04-09 17:19:07

你收到集团,在最佳/ 2退出函数,它接收一个消息。如果您在shell中启动此代码,则可以使用函数flush()验证其他消息是否仍在消息队列中。 (您发布的代码缺少t:loop/0函数,我猜它会根据N计算出一些结果并通过消息将结果返回给产卵器)

为了能够接收多条消息,必须将接收块放在一个递归调用自己的“循环”中,直到它获得所有答案。你将不得不使用一个变量,它允许递归循环知道它什么时候完成(期望的答案的数量,应该回答的进程的列表...)并且例如在列表变量中收集答案。

-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