0

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

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

2 回答 2

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和组装结果元组。

于 2013-10-18T10:57:57.783 回答
1

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

你不介意信息的顺序,

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

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

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

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.
于 2013-10-18T11:04:40.180 回答