这是一个全功能的新手问题。
我正在尝试学习一些Erlang,并创建了一个(希望并发)Monte Carlo Simulation,其中生成了多个进程,通过消息传递将其本地结果报告给父进程。
所以在父进程中我有类似
的东西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.
假设我想总结从衍生过程中收到的所有N和Ms。
我知道累积值通常是通过函数式编程中的递归来完成的,但是如何在接收语句中做到这一点。?
答案 0 :(得分: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.
乘法函数乘以X和Y,首先用循环函数启动一个新进程,然后启动Y进程,它的唯一任务就是将X发送到循环进程。
循环过程将接收X:s并将它们相加并使用新的sum再次调用自身状态。这将做Y次,然后打印结果。这基本上是Erlang的服务器模式。