查看源代码 supervisor_bridge 行为 (stdlib v6.2)

通用 supervisor 桥接行为。

此行为模块提供了一个 supervisor 桥接,一个将不按照 OTP 设计原则设计的子系统连接到监督树的进程。 supervisor 桥接位于 supervisor 和子系统之间。它对其自身的 supervisor 的行为类似于真正的 supervisor,但对于子系统来说具有与真正的 supervisor 不同的接口。有关更多信息,请参阅 OTP 设计原则中的Supervisor 行为

supervisor 桥接假定用于启动和停止子系统的函数位于一个回调模块中,该模块导出一组预定义的函数。

sys 模块可用于调试 supervisor 桥接。

除非另有说明,否则如果指定的 supervisor 桥接不存在或指定了错误的参数,则此模块中的所有函数都会失败。

另请参阅

supervisor, sys

摘要

回调

每当使用start_link/2,3启动 supervisor 桥接时,新进程都会调用此函数来启动子系统并初始化。

此函数在 supervisor 桥接即将终止时由其调用。它与Module:init/1相反,用于停止子系统并进行任何必要的清理。返回值将被忽略。

函数

创建一个无名的 supervisor 桥接进程,作为监督树的一部分。

创建一个 supervisor 桥接进程,该进程链接到调用进程,它调用Module:init/1来启动子系统。

回调

-callback init(Args :: term()) -> {ok, Pid :: pid(), State :: term()} | ignore | {error, Error :: term()}.

每当使用start_link/2,3启动 supervisor 桥接时,新进程都会调用此函数来启动子系统并初始化。

Args 是提供给启动函数的 Args 参数。

该函数应返回 {ok,Pid,State},其中 Pid 是子系统中主进程的 pid,而 State 是任意项。

如果稍后 Pid 以原因 Reason 终止,则 supervisor 桥接也将以原因 Reason 终止。如果稍后 supervisor 桥接因其 supervisor 以原因 Reason 停止,则它会调用 Module:terminate(Reason,State) 来终止。

如果初始化失败,则该函数应返回 {error,Error},其中 Error 是任何项,或 ignore

链接到此回调

terminate(Reason, State)

查看源代码
-callback terminate(Reason :: shutdown | term(), State :: term()) -> Ignored :: term().

此函数在 supervisor 桥接即将终止时由其调用。它与Module:init/1相反,用于停止子系统并进行任何必要的清理。返回值将被忽略。

如果 supervisor 桥接由其 supervisor 终止,则 Reasonshutdown。 如果 supervisor 桥接由于一个链接的进程(子系统的主进程除外)以原因 Term 终止,则 Reason 变为 Term

State 取自 Module:init/1 的返回值。

函数

链接到此函数

start_link(Module, Args)

查看源代码
-spec start_link(Module, Args) -> Result
                    when
                        Module :: module(),
                        Args :: term(),
                        Result :: {ok, Pid} | ignore | {error, Error},
                        Error :: {already_started, Pid} | term(),
                        Pid :: pid().

创建一个无名的 supervisor 桥接进程,作为监督树的一部分。

等效于 start_link/3,区别在于 supervisor 进程未注册

链接到此函数

start_link(SupBridgeName, Module, Args)

查看源代码
-spec start_link(SupBridgeName, Module, Args) -> Result
                    when
                        SupBridgeName :: {local, Name} | {global, GlobalName} | {via, Module, ViaName},
                        Name :: atom(),
                        GlobalName :: term(),
                        ViaName :: term(),
                        Module :: module(),
                        Args :: term(),
                        Result :: {ok, Pid} | ignore | {error, Error},
                        Error :: {already_started, Pid} | term(),
                        Pid :: pid().

创建一个 supervisor 桥接进程,该进程链接到调用进程,它调用Module:init/1来启动子系统。

为了确保同步启动过程,此函数在 Module:init/1 返回之前不会返回。

  • 如果 SupBridgeName={local,Name},则 supervisor 桥接使用 register/2 在本地注册为 Name
  • 如果 SupBridgeName={global,GlobalName},则 supervisor 桥接使用 global:register_name/2 在全局注册为 GlobalName
  • 如果 SupBridgeName={via,Module,ViaName},则 supervisor 桥接使用 Module 表示的注册表注册为 ViaNameModule 回调应导出函数 register_name/2unregister_name/1send/2,这些函数的行为应与 global 中的相应函数类似。因此,{via,global,GlobalName} 是一个有效的引用。

Module 是回调模块的名称。

Args 是一个任意项,它作为参数传递给 Module:init/1

  • 如果 supervisor 桥接和子系统成功启动,则该函数返回 {ok,Pid},其中 Pid 是 supervisor 桥接的 pid。
  • 如果已存在具有指定 SupBridgeName 的进程,则该函数返回 {error,{already_started,Pid}},其中 Pid 是该进程的 pid。
  • 如果 Module:init/1 返回 ignore,则此函数也返回 ignore,并且 supervisor 桥接以原因 normal 终止。
  • 如果 Module:init/1 失败或返回错误元组或不正确的值,则此函数返回 {error,Error},其中 Error 是包含错误信息的项,并且 supervisor 桥接以原因 Error 终止。