`
DiaoCow
  • 浏览: 244327 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Erlang OTP学习(2):gen_event

阅读更多
说完了gen_server,今天我们来看看gen_event。

通常我们会有这么一种需求场景:采集客户端发送的事件,并做相应的处理,如下图:

EventServer负责接收客户端发送的事件消息,当它接受到一个事件消息后,它回调所有的EventHandler处理这条信息(不同的EventHandler对同一条消息会才采取不同的响应),所以EventServer实际上是充当着代理的角色,实际的事件消息是由EventHandler处理(我们称EventHandler是EventServer的callback模块)

现在我们按照上图,实现一下EventServer:

我们可以通过add_handler方法动态的往EventServer中添加EventHandler(EventServer内部维护着一个HandlerList);
notify方法供客户端向EventServer发送事件消息,当EventServer收到一条事件消息时({event, Event}),它遍历HandlerList,把这条消息交给每个EventHandler处理;

接着,我们实现两个EventHandler(EventServer的callback模块),其中terminal_logger会把接受到的事件消息打印到控制台,file_logger会把事件消息记录到文件。




现在我们运行下程序,看下效果





event_server:start()启动了一个EventServer(初始状态下没有任何的EventHandler),接着我们动态的添加了两个EventHandler(3,4两行命令),最后我们使用event_server:notify方法向EventServer发送了两条事件消息,当EventServer收到这些消息后,回调所有的EventHandler进行处理,其中terminal_logger将收到的事件打印到了屏幕(如红色箭头部分),file_logger将事件保存到了event.log中

至此我们就实现了一个EventServer,那么gen_event是什么呢?它实际上就是我们刚才EventServer的一种实现并且提供更多更稳健的功能(譬如,不仅支持EventHandler的动态添加,也支持动态卸载),下面我们就用gen_event重新实现以下刚才的需求:




执行下程序:




第四行,我们向event_server发送一条事件消息,这时候屏幕上,文件里都记录了hello world这条事件消息,当我们调用gen_event:delete_handler方法去掉new_terminal_logger后,再次发送事件消息,这时候只有文件中会记录,屏幕上不再显示

关于gen_event我们就说道这里,更多api细节,请看:http://www.erlang.org/doc/man/gen_event.html





  • 大小: 35.5 KB
  • 大小: 30.8 KB
  • 大小: 7.4 KB
  • 大小: 8.7 KB
  • 大小: 12.3 KB
  • 大小: 3.4 KB
  • 大小: 20 KB
  • 大小: 22.3 KB
  • 大小: 13.3 KB
  • 大小: 3.7 KB
2
7
分享到:
评论

相关推荐

    erlang OTP Design Principles之Gen中文

    Erlang OTP设计原则中的Gen_Fsm行为是一个关键的概念,用于构建健壮、可扩展的并发应用程序。Gen_Fsm,即通用有限状态机,是一种行为模式,它提供了一种结构化的方法来处理具有多种状态和事件的系统。本文将深入探讨...

    erlang_otp_src_17.3.tar.gz

    7. **行为模块**:如gen_server、gen_event、gen_fsm等,是OTP设计模式的具体实现,简化了编写服务器、事件处理器和有限状态机的代码。 关于压缩包内的"otp_src_17.3",这是Erlang OTP 17.3版本的源代码目录。为了...

    Erlang OTP并发编程实战 附书源码

    2. **gen_server行为**:gen_server是Erlang OTP中最常用的行为模式,它提供了一个通用服务器模板,支持请求-响应模型。通过gen_server,你可以创建状态管理服务器,处理同步和异步调用,同时支持定时任务和错误处理...

    otp_win64_23.1.exe|otp_win64_23.1.zip

    2. OTP框架:理解其模块化设计、行为(gen_server, gen_event等)、分布式应用和系统监控。 3. RabbitMQ基本概念:掌握消息队列的工作原理、交换器(exchanges)、队列(queues)、绑定(bindings)以及消费者...

    Erlang OTP设计原理文档 中文版本

    Erlang OTP(Open Telephony Platform)是Erlang编程语言的一个核心部分,它提供了一套强大的工具和库,用于构建可靠、可扩展和容错的分布式系统。OTP设计原则着重于实现高度并发、容错性和高效能。下面将详细讨论...

    ErlangOTP 21.3.zip

    OTP是Erlang生态系统的重要组成部分,提供了许多预先设计好的行为模式(如 gen_server、gen_event 和 supervisor),这些模式使得开发者能够快速构建出符合Erlang并发哲学的应用程序。 otp_src_21.3.tar是Erlang ...

    otp_src_22.0_h.tar.gz

    OTP提供了几个设计良好的应用框架,如gen_server、gen_event、gen_fsm等,它们是基于行为模式的模块,简化了并发编程和状态管理。 5. **分布式功能** OTP支持跨节点的分布式计算,使得在多台机器上构建分布式系统...

    Erlang实战

    通过本案例的学习,我们不仅了解了如何使用Erlang构建高性能的在线IP查询服务,而且还深入学习了OTP的关键行为如gen_server、gen_fsm和gen_event的具体应用。这种实践不仅有助于初学者快速掌握Erlang的核心概念,还...

    Erlang_OTP_设计原理(含目录).pdf

    Erlang OTP设计原理是一份深入探讨Erlang/OTP(Open Telecom Platform)框架中设计模式和组织代码原则的文档。Erlang OTP作为Erlang语言的中间件平台,提供了构建可扩展和容错系统的标准方法。 文档开篇就介绍了...

    Erlang-OTP-API 离线查询英文全手册

    此“Erlang-OTP-API 离线查询英文全手册”是Erlang OTP的官方文档,包含了所有API的详细信息,是学习和开发Erlang OTP应用的重要资源。手册内容广泛,包括了以下几个核心部分: 1. **模块和函数**:手册详细列出了...

    otp_src_21.1.tar.gz

    1. **模块化设计**:OTP提供了各种预定义的进程行为模式(gen_server、gen_event、gen_fsm等),便于开发者创建符合特定模式的进程,提高了代码复用和可维护性。 2. **分布式计算**:Erlang OTP支持跨节点的进程...

    otp_src_R11B-5.tar.gz_OTP_erlang_otp-src-R11B_otp_s

    这些库包括Mnesia(分布式数据库)、Event Logger、公共接口定义语言(CIDL)以及行为模式如GenServer、GenEvent和Gen_fsm等。这些行为模式为开发者提供了构建状态管理、事件处理和分布式服务的标准结构,使得代码...

    Erlang_OTP_设计原理 中文版

    2. 行为(Behaviours):Erlang/OTP定义了一系列的行为模式,这些模式可以抽象出并发编程中的常见结构。通过行为模式,开发者可以使用预定义的模板来实现特定类型的进程。例如Gen_Server、Gen_Fsm、Gen_Event和...

    OTP Design Principles

    OTP(Open Telecom Platform)是Erlang/OTP框架的核心组成部分之一,它提供了一套成熟的、可扩展的、容错的应用程序设计模式。OTP设计原则指导开发者如何构建稳定可靠的分布式系统。本文将详细介绍OTP中的几个关键...

    erlang的翻译文档

    通过学习Erlang/OTPR11B文档,初学者可以逐步掌握Erlang的基础知识和高级特性,进而能够开发出高性能、高可靠性的分布式应用程序。此外,Erlang/OTP框架为构建复杂的应用程序提供了一套完整的设计模式和工具支持。

    Erlang入门:构建application练习5(监督树)

    2. **模块(`.erl`)**:实际实现功能的代码,可以是普通的函数模块,也可以是行为模块(如gen_server,gen_event等)。 3. **启动脚本(`.boot`)**:指定启动应用时的初始状态,包括启动哪些进程及其顺序。 4. *...

    erlang 参考手册 模块部分--自己翻译的中文版

    通过`-behaviour(Behaviour)`,模块可以声明为特定行为的回调模块,如OTP标准行为`gen_server`、`gen_fsm`、`gen_event`和`supervisor`。 4.2.3 记录(Record)定义 使用`-record(Record, Fields)`定义记录,记录...

    Erlang/OTP 中文手册(R11B)

    **Erlang/OTP 中文手册(R11B)** ...通过深入学习这份手册,读者不仅可以掌握Erlang语言的基本语法,还能了解如何利用OTP构建健壮的分布式系统,为在高并发、高可用性场景下开发软件打下坚实基础。

    timekeeper:ErlangOTP的游戏时钟应用程序

    在Erlang OTP中,应用程序通常由几个部分组成,包括行为模块(如gen_server、gen_event等)、状态管理、错误处理和进程通信。Timekeeper应用可能包含以下组件: 1. **gen_server行为模块**:Timekeeper可能实现了一...

Global site tag (gtag.js) - Google Analytics