[Erlang开发之路]回顾总结三、Erlang中的消息
2019-07-26 本文已影响0人
循环不计次
Erlang的消息介绍
Erlang是基于多进程的高并发编程语言,而进程之间通信只能通过消息传递,在Erlang中,我理解的范围内Erlang的消息传递有两种:一种是通过send也就是!操作符去发送消息,一种是通过套接字去收发消息,在这里我主要还是来讲讲receive 通用的收消息命令
Receive的介绍
- receive会检查遍历进程的邮箱一次(请注意是一次),根据guide做匹配;
- 一旦匹配到一个消息,就会从邮箱中把这个消息提取出来,执行块中的函数;之后挂起等下一条消息;
- 什么时候触发下一次匹配?有新消息来的时候,这里注意,Send之后消息是先进入邮箱,等Receive去提取消息
- 如果不加after,只有当消息匹配成功之后,才能往下走;
否则,计算收到消息却没有匹配,只会阻塞在原地,等待下一次消息到来,再次启动匹配。
也就是说,加了after Time之后就有一个超时机制,超过多少毫秒还没匹配成功就会跳过匹配收下一条消息,如果是 after 0就是一旦没匹配立刻抛弃这条消息的匹配过程。
我们来看一个给消息接收设置优先级的例子:(来自《learn you some erlang for great good》)
-module(multiproc).
important() ->
receive
{Priority, Message} when Priority > 10 ->
[Message | important()]
after 0 ->
normal()
end.
normal() ->
receive
{_, Message} ->
[Message | normal()]
after 0 ->
[]
end.
清空当前邮箱一条消息的例子:
原理其实就是无条件的匹配消息,然后邮箱就会空了
如果要全部清空,只要在尾部价格flush()尾递归就行了
如果要清空指定消息,只要在函数中精确匹配他就好了
flush()->
receive
Any->
io:format("flush:~p~n",[Any])
end.