美文网首页
[Erlang开发之路]回顾总结三、Erlang中的消息

[Erlang开发之路]回顾总结三、Erlang中的消息

作者: 循环不计次 | 来源:发表于2019-07-26 20:05 被阅读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.

相关文章

网友评论

      本文标题:[Erlang开发之路]回顾总结三、Erlang中的消息

      本文链接:https://www.haomeiwen.com/subject/sffjrctx.html