查看源代码 supervisor_bridge 行为 (stdlib v6.2)
通用 supervisor 桥接行为。
此行为模块提供了一个 supervisor 桥接,一个将不按照 OTP 设计原则设计的子系统连接到监督树的进程。 supervisor 桥接位于 supervisor 和子系统之间。它对其自身的 supervisor 的行为类似于真正的 supervisor,但对于子系统来说具有与真正的 supervisor 不同的接口。有关更多信息,请参阅 OTP 设计原则中的Supervisor 行为。
supervisor 桥接假定用于启动和停止子系统的函数位于一个回调模块中,该模块导出一组预定义的函数。
sys
模块可用于调试 supervisor 桥接。
除非另有说明,否则如果指定的 supervisor 桥接不存在或指定了错误的参数,则此模块中的所有函数都会失败。
另请参阅
摘要
回调
每当使用start_link/2,3
启动 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
。
此函数在 supervisor 桥接即将终止时由其调用。它与Module:init/1
相反,用于停止子系统并进行任何必要的清理。返回值将被忽略。
如果 supervisor 桥接由其 supervisor 终止,则 Reason
为 shutdown
。 如果 supervisor 桥接由于一个链接的进程(子系统的主进程除外)以原因 Term
终止,则 Reason
变为 Term
。
State
取自 Module:init/1
的返回值。
函数
-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 进程未注册
。
-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 表示的注册表注册为ViaName
。Module
回调应导出函数register_name/2
、unregister_name/1
和send/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
终止。