为什么这个erlang代码不起作用?

时间:2009-11-08 21:22:22

标签: process erlang concurrent-programming

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),另一个计算calc。 fib(N-1)同时为fib(N)= fib(N-1)+ fib(N-2)。当我运行前面的代码时,没有任何事情发生,光标在有限循环中停止或等待未到达的结果 plzzz我需要帮助我是一名新的Erlang程序员,提前谢谢:)

2 个答案:

答案 0 :(得分:5)

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

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

您可以通过在收件人中使用after超时来规避此类情况。

答案 1 :(得分:5)

为了使计算平行,您可以执行以下操作:

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.

重要的是,您在等待答案之前发送两个请求。 等待答案的部分当然可以以更美丽的方式完成。