zoukankan      html  css  js  c++  java
  • erlang link 与 monitor

    erlang设计中,通常会有这样一个需求: 某一个进程必须依赖于令一个进程的概念,在这样的情况下就必须对两个进程之间建立一个监控或者说连接关系,以监听对方的死亡情况。

    erlang 提供了两个这样的方法:link/1  monitor/2

    1、双向监听

    -spec link(PidOrPort) -> true when
    PidOrPort :: pid() | port().

    link(_PidOrPort) ->
    erlang:nif_error(undefined).

    把调用的此方法的进程跟_PidOrPort 链接起来,他们之间的链接是相互的。如果一条进程被退出另一条进程会受到退出消息,格式为{'EXIT', Pid, Reason}

    如果彼此都是gen_server,可以这样截取信息:

      handle_info({'EXIT', _PID, _Reason}, State) ->

        ok.

    2、单向监听:即当前调用进程去监听另一个进程。

    -spec monitor(Type, Item) -> MonitorRef when
    Type :: process,
    Item :: pid() | RegName | {RegName, Node},
    RegName :: module(),
    Node :: node(),
    MonitorRef :: reference().

    monitor(_Type, _Item) ->
    erlang:nif_error(undefined).

    eg:  monitor(process, Pid), 即当前进程监听 Pid 的退出销毁信息,如果Pid被退出或者销毁, 你的当前进程会收到{'DOWN', _Ref, _Msg, _PID, _Reason} 这样的信息

    如果你的进程是gen_server 可以这样截取信息:

      handle_info({'DOWN', _Ref, _, _PID, _Reason}, State) ->
        ok.

    简单的使用就是如此,如果需要继续深入可以看看源码,或这样官方文档。

     
  • 相关阅读:
    CSS 页面锚点设置
    CSS尺寸 物理像素、CSS像素、dip、dpr、ppi、dpi(一)
    项目代码格式化规范
    Vue 计算属性与监听属性区别
    Python操作InfluxDB
    InfluxDB学习
    Redis学习(五)| 哈希 Hash
    Redis学习(四)| 字符串 String
    Redis学习(三)| 命令、键
    Redis学习(二)| 数据类型
  • 原文地址:https://www.cnblogs.com/calvin-207/p/4371650.html
Copyright © 2011-2022 走看看