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