supervisor与gen_server使用小结

supervisor与gen_server是OTP标准库中提供的两种behavior,其中gen_server是基础的公共服务器框架,supervisor本身就是一个gen_server behavior的实例。

 

supervisor behavior是建立监控树的基础,只有一个回调函数init(Arg),返回该监控进程的监控规格,其中包括了被监控子进程的重启模式,以及所有被监控子进程的规格。这个规格比较难记,多写几遍也就记住了。

 

这里主要说明几点:

1. 子进程规格中,包含了MFA指定的子进程启动函数。这里的A必须是一个列表,F有几个参数,A列表中就要有几个元素,F没有参数时要写一个空列表[]。这与supervisor:start_link和gen_server:start_link中的Module、Argument参数不同,后两个Argument是传给init回调函数的参数,而init回调只有一个参数,所以argment没有必要时一个列表。

 

2. 子进程规格中的MFA启动函数必须启动一个子进程,并且必须将该子进程与supervisor进程连接,可以使用gen_server、supervisor的start_link,或者直接使用spawn_link,或者先创建,再link。supervisor进程中不会自动将子进程与自己连接起来,不知OTP为什么要这么设计。这个事实耗费了我两天时间才在同事提醒下发现,满脸泪水。。。

 

3. 子进程规格中的MFA正常情况下必须返回{ok, Pid}或{ok, Pid, Extra},否则supervisor也会报错,所以最好的办法就是使用gen_server:start_link, supervisor:start_link, spawn_link作为MFA的最后一条指令。

 

OTP中有些比较不易理解的地方,不容易找到为什么这样设计。


你可能感兴趣的:(server)