非常教程

Erlang 20参考手册

指南:设计原则 | Guide: Design principles

包括应用 | 8. Included Applications

8.1介绍

应用程序可以包括其他申请。安包括申请有自己的应用程序目录和.app文件,但它是作为另一个应用程序的主管树的一部分启动的。

应用程序只能由另一个应用程序包含。

包含的应用程序可以包括其他应用程序。

任何其他应用程序不包含的应用程序称为初步应用...

图8.1:主要应用程序和包含的应用程序

应用程序控制器在加载主应用程序时自动加载任何包含的应用程序,但不会启动它们。相反,包含的应用程序的最高主管必须由包含应用程序中的主管启动。

这意味着在运行时,包含的应用程序实际上是主应用程序的一部分,而包含的应用程序中的进程认为自己属于主应用程序。

8.2指定包含的应用程序

属性定义要包含的应用程序。included_applications中的键.app档案:

{application, prim_app,
 [{description, "Tree application"},
  {vsn, "1"},
  {modules, [prim_app_cb, prim_app_sup, prim_app_server]},
  {registered, [prim_app_server]},
  {included_applications, [incl_app]},
  {applications, [kernel, stdlib, sasl]},
  {mod, {prim_app_cb,[]}},
  {env, [{file, "/usr/local/log"}]}
 ]}.

8.3启动过程同步

包含的应用程序的主管树作为包含应用程序的主管树的一部分启动。如果包含和包含的应用程序中的进程之间需要同步,则可以使用启动阶段...

启动阶段由.app文件中的键start_phases定义为元组列表{Phase,PhaseArgs},其中Phase是原子,PhaseArgs则是一个术语。

的值。mod必须将包含应用程序的键设置为{application_starter,[Module,StartArgs]},在哪里Module与往常一样,应用程序回调模块。StartArgs作为回调函数的参数提供的术语。Module:start/2*

{application, prim_app,
 [{description, "Tree application"},
  {vsn, "1"},
  {modules, [prim_app_cb, prim_app_sup, prim_app_server]},
  {registered, [prim_app_server]},
  {included_applications, [incl_app]},
  {start_phases, [{init,[]}, {go,[]}]},
  {applications, [kernel, stdlib, sasl]},
  {mod, {application_starter,[prim_app_cb,[]]}},
  {env, [{file, "/usr/local/log"}]}
 ]}.

{application, incl_app,
 [{description, "Included application"},
  {vsn, "1"},
  {modules, [incl_app_cb, incl_app_sup, incl_app_server]},
  {registered, []},
  {start_phases, [{go,[]}]},
  {applications, [kernel, stdlib, sasl]},
  {mod, {incl_app_cb,[]}}
 ]}.

当使用包含的应用程序启动主应用程序时,主应用程序将以正常方式启动,即:

  • 应用程序控制器为应用程序创建应用程序主程序。
  • 应用程序主调用Module:start(normal, StartArgs)开始做最高主管。

然后,对于主应用程序和每个包含的应用程序按自顶向下、从左到右的顺序,应用程序主程序调用Module:start_phase(Phase, Type, PhaseArgs)对于为主应用程序定义的每个阶段,按该顺序排列。如果未为包含的应用程序定义阶段,则此阶段和应用程序不会调用该函数。

下列要求适用于.app包含的应用程序的文件:

  • {mod, {Module,StartArgs}}必须包括选项。此选项用于查找回调模块。Module申请。StartArgs被忽略,如Module:start/2只为主应用程序调用。
  • 如果包含的应用程序本身包含包含的应用程序,则{mod, {application_starter, [Module,StartArgs]}}必须包括选项。
  • {start_phases, [{Phase,PhaseArgs}]}选项,并且指定的阶段集必须是为主应用程序指定的阶段集的子集。

开始时prim_app如上所述,应用程序控制器在前面调用以下回调函数application:start(prim_app)返回一个值:

application:start(prim_app)
 => prim_app_cb:start(normal, [])
 => prim_app_cb:start_phase(init, normal, [])
 => prim_app_cb:start_phase(go, normal, [])
 => incl_app_cb:start_phase(go, normal, [])
ok
Erlang 20

Erlang 是一种通用的面向并发的编程语言,可应付大规模开发活动的程序设计语言和运行环境。

主页 https://www.erlang.org/
源码 https://github.com/erlang/otp
版本 20
发布版本 20.1