Erlang设计原则Behaviour
标准 Erlang/OTP 行为有
Behaviour | 功能 |
---|---|
gen_server | 用于实现 C/S 结构中的服务端 |
gen_fsm | 用于实现有限状态机 |
gen_event | 用于实现事件处理功能 |
supervisor | 用于实现监督树中的督程 |
gen_statem | 新版本中的有限状态机实现 |
平时使用最多的是gen_server
和supervisor
gen_server
erlang gen_server的使用:以银行账户服务为例
bank_account.erl
如下:
supervisor
SupFlags参数{Type, Times, Sec}
- Type: 重启策略
- one_for_one: 一个子进程终止,只重启该进程,在init的时候会启动参数内的子进程
- simple_one_for_one: 同one_for_one,但是在init的时候不会启动子进程,需要动态调用启动
- one_for_all: 一个子进程终止,将重启所有子进程
- rest_for_one: 一个子进程终止,将按顺序重启这个子进程和之后顺序的子进程
- Times: 次数(监控频率)
- Sec: 秒数(监控频率),如果在Sec秒内重启次数超过Times,则终止所有进程,并终止监控树,将由父进程决定它的命运
ChildSpec参数{Id, StartFunc, Restart, Shutdown, Type, Modules}
- Id 子进程ID标识符
- StartFunc = {M, F, A}: 子程序启动入口
- Restart: 重启方案
permanent
: 如果app终止了,整个系统都会停止工作(application:stop/1除外)。transient
: 如果app以normal的原因终止,没有影响。任何其它终止原因都谁导致整个系统关闭。temporary
: app可以以任何原因终止。只产生报告,没有其它任何影响。
- Shutdown: 终止策略
brutal_kill
: 无条件终止- 超时值(毫秒): 终止时,如果超时,则强制终止
infinity
: 如果子进程是监控树,设置为无限大,等待其终止为止
- Type:
worker
: 普通子进程supervisor
: 子进程是监控树
- Modules:
dynamic
: 当子进程是gen_event[Module]
: 当子进程是监控树、gen_server或者gen_fsm,表示回调模块名称
使用宏定义解决重复的ChildSpec指定:
cdn控制服务器的sup模块示例如下:
start_child动态添加子进程和start_link添加的监控树的区别在于:监控树退出并重启后,动态添加的子进程会丢失。
参考:
Erlang设计原则Behaviour
https://suncle.me/posts/2854299904/