首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

proc_lib

模块

proc_lib

模块摘要

遵循OTP设计原则的异步和同步启动流程的功能。

描述

这个模块用于启动遵循该流程的流程OTP Design Principles。具体而言,OTP标准行为(例如gen_servergen_statem)在启动新流程时使用此模块中的功能。这些功能也可以用来启动特殊过程,符合OTP设计原则的用户定义过程。有关示例,请参见sys and proc_libOTP设计原则中的部分。

一些有用的信息在进程启动时被初始化。父进程和父祖先的注册名称或进程标识符与关于该进程中最初调用的函数的信息一起存储。

当在“简单的Erlang”中,一个进程被认为只是为了退出原因而正常终止normal,一个开始使用的进程proc_lib也被认为是正常终止,如果它以理由shutdown或退出{shutdown,Term}shutdown是应用程序(监督树)停止时使用的原因。

当正在使用启动的进程proc_lib异常终止时(即,与另一个退出原因比normalshutdown或者{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/3BIF )相同,但是可以确保异常处理和日志记录在进程唤醒时继续按预期工作。

对于使用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使用:

代码语言:javascript
复制
-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()

类型

产生一个新的进程并按照本手册页的开头所述进行初始化。该过程是使用spawnBIF 产生的。

spawn_link(Fun) -> pid()

spawn_link(Node, Fun) -> pid()

spawn_link(Module, Function, Args) -> pid()

spawn_link(Node, Module, Function, Args) -> pid()

类型

产生一个新的进程并按照本手册页的开头所述进行初始化。该过程是使用spawn_linkBIF 产生的。

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_optBIF 产生的。

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,5BIF。

monitor不允许使用spawn选项。它导致该功能失败,并有理由badarg

stop(Process) -> ok

类型

相当于stop(Process, normal, infinity)

stop(Process, Reason, Timeout) -> ok

类型

命令进程退出并指定Reason并等待它终止。

返回ok如果进程与指定的退出ReasonTimeout毫秒。

如果通话超时,timeout则会引发异常。

如果该过程不存在,noproc则会引发异常。

该函数的实现基于terminate系统消息,并要求该进程正确处理系统消息。有关系统消息的信息,请参阅sys(3)和部分sys and proc_lib在OTP设计原则。

translate_initial_call(Process) -> {Module, Function, Arity}

类型

该功能由功能使用c:i/0c:regs/0呈现过程信息。

此函数提取使用此模块中的某个spawn或start函数启动的进程的初始调用,并将其转换为更有用的信息。Process可以是pid,也可以是一个整数元组(可以从中创建一个pid),也可以是Pid通过erlang:process_info(Pid)函数调用获取的进程的进程信息。

如果最初的调用是针对系统定义的某个行为(如gen_server或)gen_event,则会将其转换为更有用的信息。如果gen_server产生,则返回的Module是回调模块的名称,并且Functioninit(启动新服务器的功能)。

supervisorsupervisor_bridge也是gen_server过程。要返回此过程是监督者的信息和回调模块的名称,ModulesupervisorFunction是监督者回调模块的名称。Arity1因为该init/1函数最初在回调模块中被调用。

默认情况下,{proc_lib,init_p,5}如果没有找到有关初始呼叫的信息,则返回。假设调用者知道该过程已经由proc_lib模块产生。

另见

error_logger(3)

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com