2014-10-27 120 views
0

以下是我試圖從最好的方法中產生3個過程的程序。我想從所有進程接收響應並將它們存儲在一個元組中,但我只能得到一個響應。Erlang產卵過程

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://stackoverflow.com/a/20573151/49197 – 2014-10-27 09:16:59

+0

的函數名稱爲試驗(+),我認爲它應該是環() – abcd 2015-04-09 17:19:07

回答

1

你收到集團,在最佳/ 2退出函數,它接收一個消息。如果您在shell中啓動此代碼,則可以使用函數flush()驗證其他消息是否仍在消息隊列中。 (您發佈的代碼缺少t:loop/0函數,我猜它會根據N計算出一些結果並通過消息將結果返回給產卵器)

爲了能夠接收多條消息,必須將接收塊放在一個遞歸調用自己的「循環」中,直到它獲得所有答案。你將不得不使用一個變量,它允許遞歸循環知道它什麼時候完成(期望的答案的數量,應該回答的進程的列表...)並且例如在列表變量中收集答案。

0
-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