erlang的消息队列
来源:互联网 发布:渔夫淘宝秒杀神器2.0 编辑:程序博客网 时间:2024/06/05 20:45
http://wudixiaotie.iteye.com/blog/2234159
erlang的消息队列做的很牛逼,erlang的每个进程都有个消息队列,当一个进程接收到消息后,就会存储在该进程的消息队列中,然后如果进程当前执行的代码有receive Partten,则会对当前消息队列中的消息进行匹配,如果匹配成功则这条消息就从消息队列中拿走了,如果该进程继续进行接收,那么会重新对整个消息队列进行匹配,直到找到符合要求的消息,如果所有消息都不符合要求则要么等待要么超时。
所以我们可以通过下面的方法把需要的消息,从消息队列中拿出来,这种方式就是选择性接收:
- rec(Result) ->
- receive
- {msg, A} ->
- io:format("~p~m.", [A]),
- rec([{msg, A}|Result])
- after 0 ->
- Result
- end.
after 0 的作用是当遍历完整个消息队列后,立即返回结果。这种方式有什么实际用途么?
在工作中有这样的问题:例如有很多用户给一个离线的用户发送消息,这些消息都要存储在数据库的离线表中,可是我们知道,数据库的操作是非常消耗时间的,所以我们希望把某个用户的很多离线消息一次写入数据库,而不是一条消息写一次。那么接收离线消息的gen_server就要是这样的了:
Erlang代码
- handle_info({msg, From, To, Msg}, State) ->
- MsgList = rec(N),
- store_to_db(MsgList),
- {noreply, State};
- handle_info(Info, State) ->
- io:format("handle_info:~p~n", [Info]),
- {noreply, State}.
- rec(Result) ->
- receive
- {msg, _, To, _} = Msg ->
- rec([Msg|Result])
- after 0 ->
- Result
- end.
这样当收到一条消息的时候,rec就会查找整个消息队列,然后找到相同接收者的消息,把所有消息一起存储进数据库中,然后gen_server继续handle_info下一个接收者的消息。
阅读全文
0 0
- erlang的消息队列
- erlang进程间发送消息的性能
- erlang的消息发送和接收
- Linux的消息队列
- 消息队列的接收
- 消息队列的设置
- 消息队列的使用
- 消息队列的通信
- 消息队列的考虑
- 消息队列的读写
- 消息队列的使用
- 消息队列 的理解
- 常用的消息队列
- redis的消息队列
- 消息队列的作用
- redis的消息队列
- redis 的消息队列
- 消息队列的使用
- CCF——最大的矩形
- 雅虎前端优化策略
- servlet_1
- 当前view铺满activity时,无法获取焦点,导致onKeyDown被activity消费
- CodeIgniter框架数据库ar类查询分页和总数量的方法
- erlang的消息队列
- PHP爬虫框架Beanbun
- ES6学习笔记(一)
- 使用lambda需要的注意事项
- 前端学习之本地储存与cookie
- pry使用
- 正则匹配url对应参数名的值
- 为iPhone X设计
- 站在 Java 后端视角来理解目前的前端开发