Fuz*_*zix 2 erlang process 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).
Run Code Online (Sandbox Code Playgroud)
想法是将fib(N)过程分成两个过程,一个计算fib(N-2),另一个计算calc.fib(N-1)同时为fib(N)= fib(N-1)+ fib(N-2).当我运行前面的代码时,没有任何事情发生,光标在有限循环中停止或等待未到达结果.
plzzz我需要帮助我是一个新的Erlang程序员,在此先感谢:)
在你的conFib中你发送一个整数,但等待rpc中的元组.应该改为:
conFib()->
receive
{Client,N} -> Client ! {self(), regfib(N)}
end.
Run Code Online (Sandbox Code Playgroud)
您可以通过after在收到中使用超时来规避这种情况.
要使计算平行,您可以执行以下操作:
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.
Run Code Online (Sandbox Code Playgroud)
重要的是你在等待答案之前发送两个请求.等待答案的部分当然可以以更美丽的方式完成.
| 归档时间: |
|
| 查看次数: |
467 次 |
| 最近记录: |