gen_event
是通用的事件处理行为。
描述:
一个实现事件处理功能的行为模块。OTP事件处理模块包括一个通用的事件管理,负责处理可以动态添加、删除的任意数量的事件。用这个模块实现的事件管理器会有一组标准的功能接口,包括跟踪和错误报告功能。它也将融入OTP
监督树中,请参考OTP设计原则了解更多信息。
每个事件处理以回调方式来实现,回调需要导出一组预先设计好的函数,行为函数和回调函数的关系如下:
gen_event module Callback module
---------------- ---------------
%%作为监督树的一部分来创建事件管理器
gen_event:start_link -----> -
%%添加事件
gen_event:add_handler
gen_event:add_sup_handler -----> Module:init/1
%%事件通知(同步,异步)
gen_event:notify
gen_event:sync_notify -----> Module:handle_event/2
%%同步调用
gen_event:call -----> Module:handle_call/2- -----> Module:handle_info/2
%%事件删除
gen_event:delete_handler -----> Module:terminate/2
%%时间管理起中替换现有事件
gen_event:swap_handler
gen_event:swap_sup_handler -----> Module1:terminate/2
Module2:init/1
%%返回事件管理中的事件列表
gen_event:which_handlers -----> -
%%停止事件管理器
gen_event:stop -----> Module:terminate/2- -----> Module:code_change/3
由于每个事件处理模块都是回调模块,一个事件管理器可以动态添加、删除多个回调模块,因此gen_event比其它behaviours对回调模块的错误更tolerant。如果注册的回调函数失败(返回Reason),时间管理器不会失败,它会调用
Module:terminate/2,传参数:{error,{‘EXIT‘,Reason}},其它的事件不会受到任何影响。
注意:时间管理期器会自动捕获exit信号。
gen_event进程可以进入休眠状态,如果回调函数显示返回hibernate。如果服务器预计会空闲较长时间,但是这个特性要慎用。休眠意味着至少有2个垃圾收集(休眠和唤醒不久后)。一个繁忙的事件处理器在处理多个事件间处理的事情不是你想要的。
还需要注意的是,涉及到多个事件处理,一个事件返回hibernate就足够了,因为这回导致事件管理器进入休眠状态。
除非有特殊说明,这个模块中的所有均会失败,若果指定的管理器不存在,或者参数错误。
下次再补上实例代码吧!
照样一首歌曲送给大家:佛说万物生
gen_event学习