• 子进程规格

    子进程规格

    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]}