erlang port driver

1、erlang端的编写

http://www.iteye.com/topic/182040

打开多个port,使用supervisor、pg2等

erlang为与外部通信,需写port驱动,主要考虑下面的因素:
0、 和什么程序通信(perl)
1、 如果外部程序crash,要可以重启它;
2、 为了使串行访问不引入系统瓶颈,需要启动多个拷贝;

每种port对应一个supervisor,它监督一个process group,其中每个process对应一个port(调用open_port和port_close),每个process(对应port)是一个gen_server。

为了统一管理多种port,可以在所有种port的supervisor之上再增加一个supervisor。

编写process(对应port)时注意:
1、 start_link时使用{local, Id}选项,方便在appmon等程序中查看;
2、 init时需要process_flag(trap_exit, true);
3、 init时需要pg2:create(PortType);(必要时需要pg2:delete(PortType))
4、 init时需要pg2:join(PortType, Pid);(必要时需要pg2:leave(PortType, Pid))
5、 init时需要open_port();
6、 api_call时需要pg2:get_closest_pid(Type);(对本地的process产生随机访问的效果)
7、 handle_call时需要port_command(Port, Data);
8、 handle_call中port_command之后的receive可以不对超时进行处理,超时后异常,本process被重新拉起即可

supervisor时注意:
1、 start_link时使用{local, Id}选项,方便定位;
2、 init中返回{ok, {RestartStrategy = {one_for_one, MaxR = 3, MaxT = 10}, ChildSpecs}}
child_spec() = {Id,StartFunc,Restart,Shutdown,Type,Modules}
 Id = term()
 StartFunc = {M,F,A}
  M = F = atom()
  A = [term()]
 Restart = permanent | transient | temporary
 Shutdown = brutal_kill | int()>=0 | infinity
 Type = worker | supervisor
 Modules = [Module] | dynamic
  Module = atom()
3、 ...

 

 

2、C端的编写

http://cryolite.iteye.com/blog/361136

 

3、外部port和driver性能差异

http://chaoslawful.iteye.com/blog/310366

 

 如何写高效的driver
http://mryufeng.iteye.com/blog/478664

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值