【问题标题】:why doesn't this erlang code work?为什么这个erlang代码不起作用?
【发布时间】:2010-12-14 10:53:19
【问题描述】:
fib(N)->
       P1 = spawn(fun concFib:conFib/0),
       P2 = spawn(fun concFib:conFib/0),
       X=rpc(P1,N-2),Y=rpc(P2,N-1),X+Y.

conFib()->
       receive
               {Client,N} -> Client ! regfib(N)
       end.

rpc(Pid,Request)->
       case erlang:is_process_alive(Pid) of
               true -> begin
                                       Pid ! {self(),Request},
                                       receive
                                               {Pid,Respond} -> Respond
                                       end
                               end;
               false -> io:format("~w process is dead.",[Pid])
       end.


regfib(N)->
       case N<2 of
               true -> 1;
               false -> regfib(N,1,1,1)
       end.

regfib(N,N,X,_)-> X ;
regfib(N,M,X,Y)-> regfib(N,M+1,X+Y,X).

这个想法是将fib(N)进程分为两个进程,一个计算fib(N-2),另一个计算。 fib(N-1) 同时为 fib(N)=fib(N-1)+fib(N-2)。当我运行前面的代码时,什么也没有发生,并且光标在有限循环中停止或等待未到达的结果。
plzzz我需要帮助我是一个新的Erlang程序员,在此先感谢:)

【问题讨论】:

  • 不确定您对这段代码的意图是什么,但请注意 X 和 Y 不是并行计算的。
  • 我想并行计算X和Y,这是我的意图。
  • 现在您的呼叫流程基本上是 send-to-1、receive-from-1、send-to-2、recive-from-2,receive 使您的代码块。您应该将其更改为 send-to-1、send-to-2、receive-from-1、receive-from-2。
  • 你能告诉我在哪里可以找到更多的 erlang 实用 Qs???

标签: process erlang concurrent-programming


【解决方案1】:

要使计算并行,您可以执行以下操作:

fib(N)->
       P1 = spawn(fun test:conFib/0),
       P2 = spawn(fun test:conFib/0),
       P1 ! {self(), N - 2},
       P2 ! {self(), N - 1},
       receive
         {_, R1} -> R1
       end,
       receive
         {_, R2} -> R2
       end,
        R1 + R2.

重要的是在等待答案之前发送两个请求。 等待答案的部分当然可以用更漂亮的方式来完成。

【讨论】:

  • 感谢 Rickard :)...我明白了..请原谅我的回答对我来说更具体,就像 Zed 首先回答的 Q 一样。
【解决方案2】:

在您的 conFib 中您发送一个整数,但在 rpc 中等待一个元组。应该改成:

conFib()->
       receive
               {Client,N} -> Client ! {self(), regfib(N)}
       end.

您可以通过在接收中使用带有after 的超时来规避这种情况。

【讨论】:

  • 感谢 Zed :),它解决了问题,但是代码的逻辑并没有像我预期的那样工作 :(。X=rpc(P1,N-2) 和 X=rpc(P2, N-1) 不要同时工作第二个等待第一个完成。我想在不同的过程中同时计算 fib(N-1) 和 fib(N-2)。我想要更多请帮助...
猜你喜欢
  • 2018-11-05
  • 2012-02-22
  • 2023-03-03
  • 2017-10-02
  • 2016-07-10
  • 2017-04-09
  • 2013-01-30
  • 2014-05-23
  • 1970-01-01
相关资源
最近更新 更多