2013-10-18 30 views
0

我有一个主进程将从三个进程接收结果。每个产生的进程将返回一个元组,如{Pid,R}。我的目标是从三个进程中获得结果(3)并将它们保存在{R1,R2,R3}之类的元组中。我不知道如何将结果保存在元组内。以下是如何获得结果。有人可以帮助我从主进程返回元组吗?谢谢。如何从主进程接收多个进程

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

您的缩进是可怕的破碎。不要混合使用空格和制表符。 –

+0

你是什么意思,“每个产卵过程将返回一个元组......”?你是否知道他们必须将它们作为消息发送给接收进程,而不是返回它们? –

回答

1

有很多资料在你的问题不见了,所以我做了一些假设:

你不介意的信息的顺序,

的mainprocess功能仅在那里从3收集的答案其他的,

产卵的过程,并保持长期的生活过程中出了这个问题

与这些假设的范围,你可以简单地收集答案在马的责任inprocess函数在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. 
+0

谢谢。这是我需要的。 – user1874435

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

+0

谢谢。这解决了我的问题。我刚开始学习Erlang两周,所以我需要学习很多东西。我不知道我们可以将接收语句转换为变量。现在我明白了。 TY。 – user1874435