【问题标题】:Erlang spawning processesErlang 生成过程
【发布时间】:2014-12-22 07:24:12
【问题描述】:

以下是我尝试在其中生成 3 个进程的程序,形成一种称为最佳的方法。我想接收来自所有进程的响应并将它们存储在一个元组中,但我只能得到一个响应。

test() ->
    receive
     {From,N} -> From!{self(),N},
                 loop()
    end.

best(N) ->    
     Aid=spawn(fun t:loop/0),
     Aid ! {self(),N},
     Bid=spawn(fun t:loop/0),
     Bid ! {self(),N},
     Cid=spawn(fun t:loop/0),
     Cid ! {self(),N},
     receive 
        {Pid,Response} ->{Response}
     end.

有人可以帮我解决这个问题

【问题讨论】:

标签: erlang erlang-shell


【解决方案1】:

你的接收块,在 best/2 函数中,一旦收到一条消息就退出。如果您在 shell 中启动此代码,您可以使用函数 flush() 验证其他消息是否仍在消息队列中。 (您发布的代码缺少 t:loop/0 函数,我猜它会根据 N 计算一些东西并通过消息将答案返回给生成器)

为了能够接收多条消息,您必须将接收块置于一个“循环”中,该循环会递归调用自身,直到得到所有答案。您将不得不使用一个变量,让递归循环知道它何时完成(预期答案的数量,应该回答的进程列表......)并在列表变量中收集答案。

【讨论】:

    【解决方案2】:
    -module(wy).
    -compile(export_all).
    
    loop() ->
        Self = self(),
        receive 
        {From, Ref, N} ->
            From ! {Self, Ref, N * N}
        end.
    
    receive_result(Ref) ->
        receive 
        {Pid, Ref, R} ->
            io:format("process ~p: ~p~n", [Pid, R]), 
            receive_result(Ref)
        after 10 ->
            ok
        end.
    best() ->
        APid = spawn(fun loop/0),
        BPid = spawn(fun loop/0),
        CPid = spawn(fun loop/0),
    
        Self = self(),
        Ref  = make_ref(),
        APid ! {Self, Ref, 2},
        BPid ! {Self, Ref, 3},
        CPid ! {Self, Ref, 4},
    
        receive_result(Ref).
    

    您可以按照这个小代码。结果是:

    9> wy:best().
    process <0.77.0>: 4
    process <0.78.0>: 9
    process <0.79.0>: 16
    ok
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 2011-05-18
      • 2014-08-29
      • 1970-01-01
      • 2012-04-06
      相关资源
      最近更新 更多