子进程规格

  1. {Id, StartFunc, Restart, Shutdown, Type, Modules}
  2. Id = term()
  3. StartFunc = {M, F, A}
  4. M = F = atom()
  5. A = [term()]
  6. Restart = permanent | transient | temporary
  7. Shutdown = brutal_kill | integer() >=0 | infinity
  8. Type = worker | supervisor
  9. Modules = [Module] | dynamic
  10. 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 的子进程规格可以是:
  1. {ch3,
  2. {ch3, start_link, []},
  3. permanent, brutal_kill, worker, [ch3]}

例子:启动来自 Gen_Event行为 一章中的事件管理器的子进程规格可以是:

  1. {error_man,
  2. {gen_event, start_link, [{local, error_man}]},
  3. permanent, 5000, worker, dynamic}

服务器和事件管理器都必须是可以在任何时候都能访问的注册进程,所以他们被指定为 permanent

ch3 无须在终止之前作任何清理,所以无须关闭时间,只需要 brutal_kill 就足够了。 error_man 可能要给事件处理器一些时间作清理,所以 Shutdown 设置为了5000ms。

例子:启动另一个督程的子进程规格:

  1. {sup,
  2. {sup, start_link, []},
  3. transient, infinity, supervisor, [sup]}