1

这是一个完整的功能新手问题。

我正在尝试学习一些 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 和 Ms。

我知道累积值通常是通过函数式编程中的递归来完成的,但是如何在接收语句中做到这一点..?

4

1 回答 1

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.

乘法函数首先使用循环函数启动一个新进程,然后启动 Y 进程,该进程的唯一任务是将 X 发送到循环进程。

循环过程将接收 X:s 并将它们相加,并以新的总和作为其状态再次调用自身。这将执行 Y 次,然后打印结果。这基本上是 Erlang 的服务器模式。

于 2013-07-19T14:39:48.147 回答