Erlang消息选择性接收特性

原文 2015-03-06 01:44:46 发表于 CSDN,这里对以前写的文章做下收录。

从 rabbitMQ 代码中找到 gen_server2 , 对gen_server进行了一些优化。看到前辈写的博文也提到这个,引发了我的思考。见 gen_server2 - OTP gen_server优化版 。

gen_server2 引发的思考

正如 litaocheng 所说的:
gen_server 和 gen_server2 最大的不同是:
gen_server2 收到任何一条消息放到外部的队列中,当VM内部消息队列为空后,才进行消息处理,继续循环
gen_server 收到任何一条消息后,立即进行处理,处理完成后继续循环
继续阅读Erlang消息选择性接收特性

Erlang进程堆垃圾回收机制

原文 2014-05-23 00:17:52 发表于 CSDN,这里对以前写的文章做下收录。

每个Erlang进程创建之后都会有自己的PCB,栈,私有堆。erlang不知道他创建的进程会用到哪种场合下,所以一开始分配的内存比较小。如果分配的空间不够了,erlang gc会动态调整堆大小以满足需求,如果分配的空间大了,就会收缩堆,回收内存。

erlang进程堆的gc是分代gc,分代gc的想法基于统计学:大部分数据的生存周期都比较短,最新的数据更容易不再被使用。这里erlang使用young heap 和old heap来区分数据,young heap放新数据,old heap放旧数据,也就是gc后存活的数据。
继续阅读Erlang进程堆垃圾回收机制

erlang shell 命令中文说明

原文 2013-11-21 21:39:07 发表于 CSDN,这里对以前写的文章做下收录。

erlang shell 是在命令行模式下使用命令和 erlang 交互的工具。erlang shell功能十分强大,可以直接编译、加载、执行、调试模块等等,完全可以将shell做为erlang项目的终端使用。文章将对erlang shell 命令做介绍,还简单以示例说明。

打开erlang shell的帮助信息,在这里变成中文了。同时可以看下官方文档

shell 函数帮助

Eshell V5.10.2  (abort with ^G)
1> help().
** shell 内置命令 **
b()        -- 显示所有绑定的变量
e(N)       -- 重复某次查询 <N>
f()        -- 释放所有绑定的变量
f(X)       -- 释放某个绑定的变量
h()        -- 显示之前的操作
history(N) -- 设置保存之前操作命令的条数
results(N) -- 设置保存之前操作结果的条数
catch_exception(Bool) -- 设置的执行过程中的异常处理
v(N)       -- 使用某次查询的值 <N>
rd(R,D)    -- 定义一个 record
rf()       -- 移除所有 record
rf(R)      -- 移除某个 record
rl()       -- 显示所有 record
rl(R)      -- 显示某个 record 信息
rp(Term)   -- 显示某个元组的所有内容
rr(File)   -- 从一个文件或模块读取 record 定义

继续阅读erlang shell 命令中文说明

Erlang时间处理、时间戳转换

原文 2013-11-13 20:13:32 发表于 CSDN,这里对以前写的文章做下收录。

获取当前时间

erlang:now()得到的是从1970年1月1日零时起,到现在经过的时间,结果为{MegaSecs, Secs, MicroSecs}。有个问题要注意,还有另外一个函数可以实现同样的功能:os:timestamp()

那么, erlang:now() 和 os:timestamp() 的区别是什么?

erlang的解释如下:

erlang:now()

If you do not need the return value to be unique and monotonically increasing, use os:timestamp/0 instead to avoid some overhead.

os:timestamp()

The difference is that this function returns what the operating system thinks (a.k.a. the wall clock time) without any attempts at time correction. The result of two different calls to this function is not guaranteed to be different.
继续阅读Erlang时间处理、时间戳转换

skynet服务的本质与缺陷

原文 2015-11-03 22:45:17 发表于 CSDN,这里对以前写的文章做下收录。

skynet是为多人在线游戏打造的轻量级服务端框架,使用c+lua实现。使用这套框架的一个好处就是,基本只需要lua,很少用到c做开发,一定程度上提高了开发效率。但skynet文档也相对较少,所以这里利用一点时间学习和总结skynet相关内容,文章这里就讲解下skynet服务的本质与缺陷,希望能有所帮助。

skynet服务的本质

或许我们对skynet服务有着太多的疑问:

skynet服务究竟是什么,为什么有人说服务是一个lua虚拟机,服务与服务之间的通讯是怎样的,为什么服务的内存高居不下, 为什么拿skynet服务和erlang进程做比较?等等。。。而这一切的答案都在代码里面,让我们一步一步解开她的面纱。

继续阅读skynet服务的本质与缺陷

浅析lua异常捕获处理机制

原文 2015-10-19 23:13:06 发表于 CSDN,这里对以前写的文章做下收录。

异常捕获是高级语言的一大特性,通过对异常的捕获和处理,可以有效提高系统的稳定性和健壮性。无论再怎样改进代码,都不可避免出现一些异常,例如文件io错误、网络错误、内存错误等等,就要求编码对错误进行捕获,同时打印日志以便开发人员跟进问题的处理。当然,lua也提供了接口用于捕获运行时异常。

lua异常捕获函数

lua有两个函数可用于捕获异常: pcall 和 xpcall,这两个函数很类似,都会在保护模式下执行函数,效果类似try-catch,可捕获并处理异常。
两个函数的原型如下:

pcall (func [, arg1, ···])
xpcall (func, errfunc [, arg1, ···])

继续阅读浅析lua异常捕获处理机制