关于erlang中self()与Pid的思考

这几天对gen_tcp有些疑惑便看了一下最基本的客户端服务器原理,对self()和PID 工作原理也产生了疑问。花了很多时间便有了的进一步理解。
从运行的结果看 Pid与self()发生了互换。因前面理解有误故对结果产生怀疑。
1、主要是我对rpc/2 中的self() 的值是哪里来的产生疑问。
Pid ! {self(),msg}
API中是这样描述的self() -> pid() Returns the pid (process identifier) of the calling process.
看了API后便有了得到一个进程标志的理解,这样理解没有什么错误。问题是我错误的认为
Pid ! {self(),msg}中的self()是得到了Pid(即Pid ! {self(),msg}中的Pid)中的进程标志(可以理解为实际得到的当前打开窗口的进程标志。)。因为错误的理解后面就对所有的运行结果产生了怀疑和不解。消息传递又两人相互发邮件来解释是最适合不过了。这样解释很容易明白但对程序便有了偏差。
2、最后我的理解是
rpc/2 中的self() 的是获得当前窗口的进程标志。
loop/0中的self()获得到当然是spawn(fun loop/0)后在loop中存活的进程标志。
3、以后分析问题会 先从当前共有几个进程在活动理解。会更好些。
-module(area_server_final).
-export([start/0, area/2]).

start() -> {spawn(fun loop/0),spawn(fun loop2/0)}.

area(Pid, What) ->
rpc(Pid, What).

rpc(Pid, Request) ->
S=self(),
io:format("~nPid=~p,self()=~p~n",[Pid,S]),
Pid ! {self(), Request},
receive
{Pid, Response} ->
{Pid,Response}
end.


loop() ->
receive
{From, {rectangle, Width, Ht}} ->
io:format("~nFrom rectangle=~p~n",[From]),
From ! {self(), Width * Ht},
loop();
{From, {circle, R}} ->
S = self(),
io:format("~nFrom circle=~p,self=~p~n",[From,S]),
From !  {self(), 3.14159 * R * R},

loop();
{From, Other} ->
io:format("~nFrom other=~p~n",[From]),          
From ! {self(), {error,Other}},
loop()
end.
loop2() ->
receive

{From, Other} ->
S = self(),
io:format("~nFrom other=~pself()=~p~n",[From,S]),          
From ! {self(), {error,Other}},
loop()
end.
运行结果:
14> {P1,P2}=area_server_final:start().   
{<0.60.0>,<0.61.0>}
15> area_server_final:area(P2,22).  

Pid=<0.61.0>,self()=<0.35.0>

From other=<0.35.0>self()=<0.61.0>
{<0.61.0>,{error,22}}
16> area_server_final:area(P1,{circle,22}).

Pid=<0.60.0>,self()=<0.35.0>

From circle=<0.35.0>,self=<0.60.0>
{<0.60.0>,1520.52956}
17>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值