从Receive...end.进程退出看Erlang的进程机制

Process,进程(实际上我觉得Erlang的Process更像Thread微线程),processes存在于每个erlang虚拟机内,命令
erlang:processes().
可查看当前虚拟机内存活的进程.
Erlang进程间的通信都是靠消息传递来实现的,学了Erlang这么久终于似乎明白点什么了,包括消息传递的方法,消息的接收方法,触发事件,mailbox等,既然消息都是在活体进程上发送和接收的,显然进程的产生和存活机制很值得研究,今天偶然发现Erlang每执行完一个函数,承载则个函数的进程会退出,而不是继续监听。
先看一段代码:

-module(test).
-compile([export_all]).
start()->
spawn(test,receivem,[]).

send(Pid,Message)->
Pid ! {Message}.

receivem()->
receive
{A}->
io:format("receive message:~p~n",[A]),
end.

compile后在终端执行:
1>P1=test:start().
<0.39.0>
2>test:send(P1,"blabla...").
receive message:"blabla..."
{"blabla..."}
3>test:send(P1,"blabla...again").
{"blabla...again"}
第一条命令创建了一个进程并且把它的ID和P1绑定,然后步骤2中调用send()函数像P1发送了一个消息,可以看到消息成功收到并且io;format出来,同样在步骤3再次发送消息,却没有被正确接受.
erlang:processes().一下看看:
<0.0.0>,<0.2.0>,<0.4.0>,<0.5.0>,<0.7.0>,<0.8.0>,<0.9.0>,
<0.10.0>,<0.11.0>,<0.12.0>,<0.13.0>,<0.14.0>,<0.15.0>,
<0.17.0>,<0.18.0>,<0.19.0>,<0.20.0>,<0.22.0>,<0.23.0>,
<0.24.0>,<0.25.0>,<0.29.0>]
可以看到,<0.39.0>这个进程挂掉了,为什么呢?<<programming Erlang>>这本书内完整论述了Erlang的进程退出机制,我翻来覆去就是没有找到为什么这个进程为什么挂了,后来终于知道,它不是挂了,只是正常退出,如开头所说的,Erlang每执行完一个函数,承载则个函数的进程会退出,汇编语言学的不好,可能这个是常识,写出来吧,警醒自己,帮助他人.
如果要让P1一直存在并且继续监听,可以通过尾递归来实现,在end之前从新调用receivem()函数,从新等待mailbox的消息进行模式匹配。
即receivem()函数改为:

receivem()->
receive
{A}->
io:format("receive message:~p~n",[A]),
%process exit without the line
receivem()
end.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值