2013-07-19 22 views
1

這是一個全功能的新手問題。如何用SSA在Erlang中累積結果?

我想學習一些Erlang,並且已經創建了一個(希望併發的)蒙特卡洛仿真,其中生成了多個進程,它們通過消息傳遞將其本地結果報告給父進程。

所以在父進程我有一些像

parent(NumIterations, NumProcs) -> 
    random:seed(), 

    % spawn NumProcs processes 
    lists:foreach(
     spawn(moduleName, workerFunction, [self(), NumIterations/NumProcs, 0, 0]), 
     lists:seq(0, NumProcs - 1)), 

    % accumulate results 
    receive 
     {N, M} -> ???; % how to accumulate this into global results? 
     _  -> io:format("error") 
    end. 

比方說,我想總結一下所有Ns和從產生的進程收到的女士。

我知道積累值通常是通過函數式編程中的遞歸完成的,但是如何在接收語句中做到這一點..?

回答

1

您必須在一個單獨的過程中接收結果,該過程充當計算的「目標」。下面是顯示原理做乘法的複雜的方式:

-module(example). 

-export([multiply/2, loop/2]). 

multiply(X, Y) -> 
    Pid = spawn(example, loop, [0, Y]), 
    lists:foreach(fun(_) -> spawn(fun() -> Pid ! X end) end, lists:seq(1, Y)). 

loop(Result, 0) -> io:format("Result: ~w~n", [Result]); 
loop(Result, Count) -> 
    receive 
     X -> loop(Result + X, Count - 1) 
    end. 

乘法功能multiplys X和Y首先開始一個新的進程與迴路功能,然後開始他們的唯一任務是爲Y過程將X發送到循環進程。

循環進程將接收X:並將它們相加,並以新的總和作爲它的狀態再次調用自己。這將執行Y次,然後打印結果。這基本上是Erlang的服務器模式。