- 子进程规格
子进程规格
- {Id, StartFunc, Restart, Shutdown, Type, Modules}
- Id = term()
- StartFunc = {M, F, A}
- M = F = atom()
- A = [term()]
- Restart = permanent | transient | temporary
- Shutdown = brutal_kill | integer() >=0 | infinity
- Type = worker | supervisor
- Modules = [Module] | dynamic
- Module = atom()
- Id 是督程内部用于标识子进程规范的名称。
- StartFunc 定义了用于启动子进程的很难书调用。它是一个模块.函数.参数的元组,与 apply(M,F,A) 用的一样。
- Restart 定义了一个被终止的子进程要在何时被重启:
- permanent 子进程总会被重启。
- temporary 子进程从不会被重启。
- transient 子进程只有当其被异常终止时才会被重启,即,退出理由不是 normal 。
- Shutdown 定义了一个子进程应如何被终止。
- brutal_kill 表示子进程应使用 exit(Child,kill) 进行无条件终止。
- 一个整数超时值表示督程先通过调用 exit(Child,shutdown) 告诉子进程要终止了,然后等待其返回退出信号。如果在指定的事件内没有接受到任何退出信号,那么使用 exit(Child,kill) 无条件终止子进程。
- 如果子进程是另外一个督程,那么应该设置为 infinity 以给予子树足够的时间关闭。
- Type 指定子进程是督程还是佣程。
- Modules 应该为只有一个元素的列表 [Module],其中 Module 是回调模块的名称,如果子进程是督程、genserver或者gen_fsm。如果子进程是一个gen_event,那么 Modules 应为 dynamic 。在升级和降级过程中发布处理器将用到这个信息,参见 [发布处理_]($d3ace8c0f7b8cc3b.md#release-handling) 。例子:启动上面例子中的服务器 ch3 的子进程规格可以是:
- {ch3,
- {ch3, start_link, []},
- permanent, brutal_kill, worker, [ch3]}
例子:启动来自 Gen_Event行为 一章中的事件管理器的子进程规格可以是:
- {error_man,
- {gen_event, start_link, [{local, error_man}]},
- permanent, 5000, worker, dynamic}
服务器和事件管理器都必须是可以在任何时候都能访问的注册进程,所以他们被指定为 permanent 。
ch3 无须在终止之前作任何清理,所以无须关闭时间,只需要 brutal_kill 就足够了。 error_man 可能要给事件处理器一些时间作清理,所以 Shutdown 设置为了5000ms。
例子:启动另一个督程的子进程规格:
- {sup,
- {sup, start_link, []},
- transient, infinity, supervisor, [sup]}