如何从主进程接收多个进程

时间:2013-10-18 07:41:03

标签: erlang

我有一个主流程,可以从三个流程中获得结果。每个衍生的进程都会返回一个像{Pid,R}这样的元组。我的目标是从三个进程中获取结果(3)并将它们保存在像{R1,R2,R3}这样的元组中。我不知道如何将结果保存在元组中。以下是如何获得结果。有人可以帮助我从主进程返回元组吗?谢谢。

mainprocess(N)->
    receive
        {Pid1,R1}->
            R1,
            loop();
        {Pid2,R2}->
            R2,
            loop();
        {Pid3,R3}->
            R3,
            loop()
    end.

2 个答案:

答案 0 :(得分:1)

最简单的解决方案是在单独的接收中等待每个进程,例如

main() ->
    Pid1 = spawn(?MODULE, worker, [self(), 1]),
    Pid2 = spawn(?MODULE, worker, [self(), 2]),
    Pid3 = spawn(?MODULE, worker, [self(), 3]),
    R1 = receive
             {Pid1, N} ->
                 N
         end,
    R2 = receive
             {Pid2, N2} ->
                 N2
         end,
    R3 = receive
             {Pid3, N3} ->
                 N3
         end,
    {R1,R2,R3}.

这里首先等待第一个进程的结果。一旦收到它,它继续前进并等待第二个过程的结果,然后对第三个结果同样的事情。

无需递归调用main并组合结果元组。

答案 1 :(得分:1)

您的问题中缺少许多信息,因此我做了一些假设:

你不介意信息的顺序,

mainprocess函数只用于收集其他3个答案,

产生流程和维持长期生存过程的责任超出了本问题的范围

通过这些假设,您可以简单地在3个不同的变量中收集mainprocess函数中的答案,并在最后构建元组:

main_process_init(N) -> 
%% I don't know what is the usage of N in your example I just forward it to the loop
    R1 = get_answer(),
    R2 = get_answer(),
    R3 = get_answer(),
    main_process_loop(N,{R1,R2,R3}). 
    %% I suppose that when you got the answers you can enter in the main process loop

%% each message is received in a separate receive bloc
get_answer() ->
    receive
        {_,R} -> R   %% you never use the information Pid, so don't care about its value
    end.