Posts Tagged ‘erlang’

[erlang库源码阅读]gen_server.erl

继续接着上一篇文章分析gen.erl来分析下gen_server.

在gen.erl中,start操作最终会走到GenMod:init_it函数中,这里的GenMod就是gen_server/fsm/event三个模块,所以先来看看gen_server中的init_it函数.

%%% ---------------------------------------------------
%%% Initiate the new process.
%%% Register the name using the Rfunc function
%%% Calls the Mod:init/Args function.
%%% Finally an acknowledge is sent to Parent and the main
%%% loop is entered.
%%%

[erlang库源码阅读]gen.erl

gen系列代码,gen_server,gen_event,gen_fsm的代码都在erlang代码的lib/stdlib中,它们都是以gen.erl为基础的.gen.erl中定义了一些这几个behavior公有的代码,所以首先来看看gen.erl做了什么.

gen.erl中主要是定义了以下几个操作:start(启动一个gen系列的服务器),call(向gen系列服务器send请求并且等待回复).

1) start

start(GenMod, LinkP, Mod, Args, Options) ->
    do_spawn(GenMod, LinkP, Mod, Args, Options).
do_spawn(GenMod, _, Name, Mod, Args, Options) ->
    Time = timeout(Options),

根据erlang自定义behaviour生成编译依赖关系

erlang中可以自定义behaviour,但是如果一个模块是实现了该自定义behaviour的话,那么首先要编译behaviour,其次在编译该模块时加入-pa指定编译好的behaviour.beam路径,否则编译的时候会提示该behaviour未定义.

换句话说,实现需要依赖到behaviour模块编译.

因此需要根据代码中的这种依赖关系,对代码进行一次梳理,定义一个正确的编译顺序.幸而rabbitmq项目已经有这样的代码,我就抽取出来用了,具体的实现还没有细看.在这个框架的文件组织中,erl文件放在src子目录下面,在src/Makefile中,首先以当前目录的所有erl文件为参数调用../generate_deps(这个文件取自rabbitmq项目)来产生依赖关系文件deps.mk,注意要在Makefile中include这个文件,这样新的依赖关系才会起效,然后编译会自动根据新的依赖关系来安排编译的顺序了.有了这些,你所需要做的就是把你写的erl文件放在src目录下面,依赖关系什么的,由Makefie搞定了.

示例项目在

抽取rabbitmq网络层做的echo server

传说rabbitmq网络层实现的优雅高效,于是我就尝试着将其中的网络层抽取出来,模拟着做了一个echo服务器,代码放在

erlang中使用google protobuf进行通信

初学erlang,花了不少的功夫,想要在erlang中集成google的protobuf用于消息通信.个人觉得,使用类似protobuf这样通用的编解码模块,有一个好处就是这部分完全交给别人,再不用自己关心什么很操蛋的大小端,数据长度等琐碎的问题,另外,protobuf使用.proto文件自描述协议,C/S端人员可以通过这个来讨论问题,一目了然.

然而,要把它集成到erlang中还是一件比较麻烦的事情,一来google官方没有对erlang进行支持,这也许是因为google官方认定的编程语言只有C++,java,Python三种的缘故吧,而它的竞争对手,如thrift等都提供了erlang的支持.虽然官网上给出了第三方做的其他语言的实现,但是毕竟不是官方的实现,可能会有些未知的问题.比如我很担心我使用erlang非官方的protobuf实现写了一个服务器,但是再用比如python写了一个客户端,C/S两端都使用protobuf进行通信,但是由于编解码实现的差异,导致了协议数据有出入.

不过,鉴于我在搜索资料的时候未发现比较好的介绍如何在erlang中使用protobuf的方式,还是记录一下吧.

1)