美文网首页erlang
erlang的三驾马车proc_lib,gen,sys

erlang的三驾马车proc_lib,gen,sys

作者: Alking | 来源:发表于2019-12-10 00:08 被阅读0次

erlang的三驾马车proc_lib,gen,sys

1.为什么推荐使用proc_lib?

erlang:spawn构建的process在运行失败的时候没有crash_report
但是proc_lib:spawn构建的process有
在每个进程字典中都保存了$ancestors$initial_call
$ancestors保存了进程的祖先格式:[Father, GrandFather...]
$initial_call保存了调用点MFA
proc_lib既是erlang底层函数的简单封装,而且额外增加了process信息,详细记录了出错原因

2.gen 的使用技巧

2.1.定义了proc的name规则(whereis,register_name,unregister)

相关回调(callback)

whereis_name:
local -> erlang:whereis(Name)
global -> global:whereis_name(Name)
via -> Mod:whereis_name(Name)
unregister:
local -> erlang:unregister(Name)
global -> global:unregister_name(Name)
via  -> Mod:unregister_name(Name)
register:
local -> erlang:register(Name, self())
global -> global:register_name(Name, self()) 
via -> Module:register_name(Name, self())

这里除了系统定义的本地名字规则和全局名字规则之外,开发者还可以自己定义(via)一个名字规则,比如可以使用redis,mysql等来做名字到pid的映射,方便定制

2.2. gen是gen_server,gen_event,gen_statem和proc_lib的桥接

gen抽象出了GenMod:init_it的行为,让gen_server,gen_event等有统一的初始化回调,并且桥接了proc_lib,使得gen_server等有完成的crash日志

2.3. gen抽象了call,stop,reply行为

在执行call,stop操作的时候,统一进行了monitor行为,捕获了对象Down的消息

3. sys对proc更多的掌控

3.1 suspend,resume

suspend和resume是proc的运行时hook,主要作用是挂起和继续
可以用在热更上,入sasl的relup功能就依赖这两个hook
如果想要了解更多细节,请参阅release_handler.erl

实现方式:
向目标进程发送消息{system, From, suspend}
proc便会一直Loop,直到收到 `` {system, From, Req}消息,忽略其他的消息
从外面看来这个时候的proc就像是在挂起一样

3.2 get_state,replace_state

这两个函数主要的作用是得到,设置proc的状态(我习惯上叫Actor的状态)
前者在调试代码的时候非常有用,可以每时每刻看到gen_server的状态,是否符合自己的预期

实现方式:
向目标进程发送消息{system, From, get_state}
回调函数:Mod:system_get_state(Misc),便可以获取proc的state,完全符合状态和代码完全隔离的效果

向目标进程发送消息{system, From, {replace_state, StateFun}}
回调函数:{ok, State, NMisc} = Mod:system_replace_state(StateFun, Misc)
StateFunNState = StateFun(State)就是将一个状态转化为另一个状态

3.3 log,trace,trace,statistics,log_to_file

这几个函数主要是对proc近期收到消息的情况的一些概况,近期收到几条消息(statistics),这些消息内容是什么(log)?还可以将这些消息内容写到文件里面(log_to_file)

实现方式:
这几个函数都在操控gen_server的options的 {debug, L}参数中
主要包含

{debug,true|false}
{log,N}
{log_to_file, false}
{log_to_file, Fd}

来实现上面的需求,具体代码请参考sys.erl

总结

三驾马车能让人对erlang程序有更深的理解。对如何规范的设计系统以及每一个Actor有很大的帮助,抽象出更通用的业务逻辑

相关文章

  • erlang的三驾马车proc_lib,gen,sys

    erlang的三驾马车proc_lib,gen,sys 1.为什么推荐使用proc_lib? erlang:spa...

  • 定义百万会员社群的三驾马车

    超级群主养成记(三) 第三课 定义百万会员社群的三驾马车 拉动我国经济增长有三驾马车,而社群发展也有三驾马车。 见...

  • 【超级群主训练营】年入百万的群主都是怎样炼成的?

    今天听了超级群主训练营的第三课:社群商业时代增长的三驾马车。 三驾马车是什么? 三驾马车:新人群、新基因、新机会 ...

  • 三驾马车

    一个人工作生活的底层逻辑是什麽? 三驾马车从何处来?又带你去向何方? 每个人的行事处世方式和得到的结果都不一样,决...

  • 三驾马车

  • 三驾马车

    我有一辆马车 三匹马牵引的战车 一驾是我的人生 源至最开始一切的衍生 一驾是学问 我的高度与深度 而另一驾 是健康...

  • 三驾马车

    岁月是把磨石刀 从2009年踏出校园,不知不觉已然过了十年了。现在回想,这时光过的好快。十年都在一家公司工作,已经...

  • erlang面试题

    erlang常规面试题 基础 消息发送 基础相关 OTP相关 gen_server:cast和erlang:sen...

  • Linux处理文本的三驾马车-grep命令及使用例子

    Linux处理文本的三驾马车为 • grep• sed• awk Linux处理文本的第一驾马车——grep命令 ...

  • 何为中国投资转型的密码?

    经济学规律告诉我们,社会需求决定了投资方向,目前,中国投资正从老的“三驾马车”转型新的“三驾马车”。 老的“三驾马...

网友评论

    本文标题:erlang的三驾马车proc_lib,gen,sys

    本文链接:https://www.haomeiwen.com/subject/uphwgctx.html