proc_lib
proc_lib
模块
proc_lib
模块摘要
遵循OTP设计原则的异步和同步启动流程的功能。
描述
这个模块用于启动遵循该流程的流程OTP Design Principles
。具体而言,OTP标准行为(例如gen_server
和gen_statem
)在启动新流程时使用此模块中的功能。这些功能也可以用来启动特殊过程
,符合OTP设计原则的用户定义过程。有关示例,请参见sys and proc_lib
OTP设计原则中的部分。
一些有用的信息在进程启动时被初始化。父进程和父祖先的注册名称或进程标识符与关于该进程中最初调用的函数的信息一起存储。
当在“简单的Erlang”中,一个进程被认为只是为了退出原因而正常终止normal
,一个开始使用的进程proc_lib
也被认为是正常终止,如果它以理由shutdown
或退出{shutdown,Term}
。shutdown
是应用程序(监督树)停止时使用的原因。
当正在使用启动的进程proc_lib
异常终止时(即,与另一个退出原因比normal
,shutdown
或者{shutdown,Term}
,)一个崩溃报告
生成,其由缺省SASL事件处理程序写入到终端。也就是说,崩溃报告
通常只在SASL应用程序启动时才可见; 见sasl(6)
和区段SASL Error Logging
的SASL用户指南中。
与“纯Erlang”不同,proc_lib
进程不会生成错误报告
,这些报告
由仿真器写入终端,不需要启动SASL。所有异常都被转换为默认处理程序忽略的出口
error_logger
。
崩溃报告包含先前存储的信息,如祖先和初始函数,终止原因以及由于此过程终止而终止的其他进程的信息。
数据类型
spawn_option() =
link |
monitor |
{priority,
priority_level()
} |
{max_heap_size,
max_heap_size()
} |
{min_heap_size, integer() >= 0} |
{min_bin_vheap_size, integer() >= 0} |
{fullsweep_after, integer() >= 0} |
{message_queue_data, off_heap | on_heap | mixed}
见erlang:spawn_opt/2,3,4,5
...
priority_level() = high | low | max | normal
max_heap_size() =
integer() >= 0 |
#{size => integer() >= 0,
kill => true,
error_logger => true}
参见erlang:process_flag(max_heap_size, MaxHeapSize)
。
dict_or_pid() =
pid() |
(ProcInfo :: [term()]) |
{X :: integer(), Y :: integer(), Z :: integer()}
出口
format(CrashReport) -> string()
类型
相当于format(CrashReport, latin1)
。
format(CrashReport, Encoding) -> string()
类型
用户定义的事件处理函数可以使用此函数来格式化崩溃报告。崩溃报告使用发送error_logger:error_report(crash_report,CrashReport)
。也就是说,要处理的事件是格式{error_report, GL, {Pid, crash_report, CrashReport}}
,发送崩溃报告GL
的进程的组长pid 在哪里Pid
。
format(CrashReport, Encoding, Depth) -> string()
类型
用户定义的事件处理函数可以使用此函数来格式化崩溃报告。当Depth被指定为正整数时,它将在格式字符串中用于限制输出,如下所示:io_lib:format("~P", [Term,Depth])
。
hibernate(Module, Function, Args) -> no_return()
类型
这个函数的作用与(并且确实调用了hibernate/3
BIF )相同,但是可以确保异常处理和日志记录在进程唤醒时继续按预期工作。
对于使用proc_lib
函数启动的进程,始终使用此函数而不是BIF 。
init_ack(Ret) -> ok
init_ack(Parent, Ret) -> ok
类型
该功能必须由已由start[_link]/3,4,5
功能启动的进程使用。它Parent
表明该进程已经初始化自己,已经开始,或者未能初始化自己。
函数init_ack/1
使用之前由所使用的开始函数存储的父值。
如果这个函数没有被调用,start函数会返回一个错误元组(如果使用了链接和/或超时),否则就会挂起。
下面的示例说明了此函数和proc_lib:start_link/3
使用:
-module(my_proc).
-export([start_link/0]).
-export([init/1]).
start_link() ->
proc_lib:start_link(my_proc, init, [self()]).
init(Parent) ->
case do_initialization() of
ok ->
proc_lib:init_ack(Parent, {ok, self()}
{error, Reason} ->
exit(Reason)
end,
loop().
...
initial_call(Process) -> {Module, Function, Args} | false
类型
提取使用此模块中的某个spawn或start函数启动的进程的初始调用。Process
可以是pid,也可以是一个整数元组(可以从中创建一个pid),也可以是Pid
通过erlang:process_info(Pid)
函数调用获取的进程的进程信息。
注
该列表Args
不再包含参数,但是与参数数量相同的原子数量; 第一个原子是'Argument__1'
第二个'Argument__2'
,依此类推。原因是参数列表可能会浪费大量内存,并且如果参数列表包含funs,则可能无法升级模块的代码。
如果该过程是通过有趣的方式产生的,则initial_call/1
不再返回乐趣,而是例如实现乐趣的本地函数的模块,函数和{some_module,-work/3-fun-0-,0}
(例如,函数中创建的乐趣some_module:work/3
)。原因是保持乐趣会阻止模块的代码升级,并且可能会浪费大量的内存。
spawn(Fun) -> pid()
spawn(Node, Fun) -> pid()
spawn(Module, Function, Args) -> pid()
spawn(Node, Module, Function, Args) -> pid()
类型
产生一个新的进程并按照本手册页的开头所述进行初始化。该过程是使用spawn
BIF 产生的。
spawn_link(Fun) -> pid()
spawn_link(Node, Fun) -> pid()
spawn_link(Module, Function, Args) -> pid()
spawn_link(Node, Module, Function, Args) -> pid()
类型
产生一个新的进程并按照本手册页的开头所述进行初始化。该过程是使用spawn_link
BIF 产生的。
spawn_opt(Fun, SpawnOpts) -> pid()
spawn_opt(Node, Function, SpawnOpts) -> pid()
spawn_opt(Module, Function, Args, SpawnOpts) -> pid()
spawn_opt(Node, Module, Function, Args, SpawnOpts) -> pid()
类型
产生一个新的进程并按照本手册页的开头所述进行初始化。该过程是使用spawn_opt
BIF 产生的。
注
monitor
不允许使用spawn选项。它导致该功能失败,并有理由badarg
。
start(Module, Function, Args) -> Ret
start(Module, Function, Args, Time) -> Ret
start(Module, Function, Args, Time, SpawnOpts) -> Ret
start_link(Module, Function, Args) -> Ret
start_link(Module, Function, Args, Time) -> Ret
start_link(Module, Function, Args, Time, SpawnOpts) -> Ret
类型
同步启动一个新进程。产生过程并等待它开始。当进程开始时,它必须
调用init_ack(Parent, Ret)
或者init_ack(Ret)
,Parent
评估这个函数的进程在哪里。在这个时候,返回Ret
。
如果函数start_link/3,4,5
被使用并且进程在调用之前崩溃init_ack/1,2
,{error, Reason}
则在调用进程陷阱退出时返回。
如果Time
指定为整数,则此函数等待Time
新进程调用init_ack
或{error, timeout}
返回的毫秒数,并且该进程被终止。
参数SpawnOpts
,如果指定,则作为最后一个参数传递的spawn_opt/2,3,4,5
BIF。
注
monitor
不允许使用spawn选项。它导致该功能失败,并有理由badarg
。
stop(Process) -> ok
类型
相当于stop(Process, normal, infinity)
。
stop(Process, Reason, Timeout) -> ok
类型
命令进程退出并指定Reason
并等待它终止。
返回ok
如果进程与指定的退出Reason
内Timeout
毫秒。
如果通话超时,timeout
则会引发异常。
如果该过程不存在,noproc
则会引发异常。
该函数的实现基于terminate
系统消息,并要求该进程正确处理系统消息。有关系统消息的信息,请参阅sys(3)
和部分sys and proc_lib
在OTP设计原则。
translate_initial_call(Process) -> {Module, Function, Arity}
类型
该功能由功能使用c:i/0
并c:regs/0
呈现过程信息。
此函数提取使用此模块中的某个spawn或start函数启动的进程的初始调用,并将其转换为更有用的信息。Process
可以是pid,也可以是一个整数元组(可以从中创建一个pid),也可以是Pid
通过erlang:process_info(Pid)
函数调用获取的进程的进程信息。
如果最初的调用是针对系统定义的某个行为(如gen_server
或)gen_event
,则会将其转换为更有用的信息。如果gen_server
产生,则返回的Module
是回调模块的名称,并且Function
是init
(启动新服务器的功能)。
supervisor
和supervisor_bridge
也是gen_server
过程。要返回此过程是监督者的信息和回调模块的名称,Module
是supervisor
和 Function
是监督者回调模块的名称。Arity
是1
因为该init/1
函数最初在回调模块中被调用。
默认情况下,{proc_lib,init_p,5}
如果没有找到有关初始呼叫的信息,则返回。假设调用者知道该过程已经由proc_lib
模块产生。
另见
error_logger(3)