精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-02-10
最后修改:2009-02-12
rabbitmq
的代码中包含一个gen_server2
, 其对Erlang OTP中的gen_server进行了一些优化. loop(Parent, Name, State, Mod, hibernate, Debug) -> proc_lib:hibernate(?MODULE,wake_hib,[Parent, Name, State, Mod, Debug]); loop(Parent, Name, State, Mod, Time, Debug) -> Msg = receive Input -> Input after Time -> timeout end, decode_msg(Msg, Parent, Name, State, Mod, Time, Debug, false).
loop(Parent, Name, State, Mod, Time, Queue, Debug) -> receive Input -> loop(Parent, Name, State, Mod, Time, queue:in(Input, Queue), Debug) after 0 -> case queue:out(Queue) of {{value, Msg}, Queue1} -> process_msg(Parent, Name, State, Mod, Time, Queue1, Debug, Msg); {empty, Queue1} -> receive Input -> loop(Parent, Name, State, Mod, Time, queue:in(Input, Queue1), Debug) after Time -> process_msg(Parent, Name, State, Mod, Time, Queue1, Debug, timeout) end end end.
gen_server2, 其首先从inner msg quue中匹配任意(ANY)一条消息, 随后添加都外部的quue队列中. 随后继续进入Loop循环, 因此, 其实际的做法是首先将所有的消息从inner msg queue中取出,然后放入queue队列, 当inner msg quue没有任何消息时, 也就是after 0 的情况, 然后从queue中取出(queue:out/1)一个消息,交给process_msg进行处理. 如果queue为空,则进行第二次将inner msg导入到quue中的过程.
这样做gen_server2使所有的msg经历了一个从inner msg queue到外部queue的过程, 其减少了虚拟机内部的资源消耗, 但是这些消息都存储到外部的queue, 总体来说内存还是没有什么太大的变化.
最大的不同是: gen_server2 收到任何一条消息放到外部的queue中, 当inner msg quue为空后,才进行消息处理, 继续循环. gen_server 收到任何一条消息后,立即进行处理, 处理完成后继续循环.
我没有亲自做测试, 至于上面merle相关的测试, 唯一的解释就是, gen_server2拥有一个比较"空闲"的inner msg queue, 对于其性能提升具有某种好处. 回头我会具体测试一下.
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-02-10
很好很强大
楼主功力愈加深厚啦 |
|
返回顶楼 | |
发表时间:2009-02-11
选择性消息接收是有这个缺陷的!
http://blog.yufeng.info |
|
返回顶楼 | |
浏览 3248 次