[elixir! #0013] 漫话源码之 GenEvent

什么是 GenEvent

GenEvent 是一个用来实现函数化的事件处理行为的模块.

事件处理模型包含了一个通用的事件管理进程, 以及多个可以被动态添加和删除的事件句柄.

例子

GenEvent 有许多应用场景, 例如, 构建一个日志收集系统. 不同的 log 消息对应不同的处理方式. 有的消息会在终端打印出错误信息, 有的会写入文件, 有的会保存在内存中.

# 定义一个事件处理者
defmodule LoggerHandler do
  use GenEvent

# 定义回调

  def handle_event({:log, x}, messages) do
    {:ok, [x | messages]}
  end

  def handle_call(:messages, messages) do
    {:ok, Enum.reverse(messages), []}
  end
end

# 启动一个新的事件管理者

{:ok, pid} = GenEvent.start_link([])

# 将处理者添加到到管理者名下

GenEvent.add_handler(pid, LoggerHandler, [])

#=> :ok

# 发送一些事件给管理者.

GenEvent.notify(pid, {:log, 1})

#=> :ok

GenEvent.notify(pid, {:log, 2})

#=> :ok

# 调用管理者名下特定的处理者.

GenEvent.call(pid, LoggerHandler, :messages)

#=> [1, 2]

GenEvent.call(pid, LoggerHandler, :messages)

#=> []
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值