Erlang OTP gen_event (0)

12606 ワード

元の英語ドキュメント:http://www.erlang.org/erldoc?q=&x=0&y=0
Tips:ページの右側の検索機能を見ましたか.この実用的なページを保存しましょう.
  
任意の数のイベントを動的に削除および追加できるイベントマネージャ(event_manager)を実装するイベント処理機能動作モジュールで、追跡およびエラーレポート機能を含む標準的なインタフェース機能を実装します.同様にOTPモニタツリー(supervision tree)にも適しています
    各イベントハンドラは、コールバックモジュールの事前定義された機能のセットをエクスポートするために実装される.
    各イベントハンドラはコールバックモジュールであり、イベントマネージャはイベントコールバックを動的に追加および削除することができるのでgen_eventは他のbehaviours(gen_server,gen_fsm)よりフォールトトレランスが更新され、インストールされたイベント処理コールバックに失敗した場合(fails with Reason or returns a bad value Term)、このイベントマネージャは失敗しない.彼はこのイベントコールバックを削除し、イベントに対するterminate/2を呼び出す.与えられたパラメータは、他のイベントは影響を受けません.
   イベント管理は自動処理(trap)exit signals,%手動でprocess_flag(trap_exit,true)を呼び出す. 
   イベントマネージャのコールバック戻り値にhibernationがスリープ状態に入ることができる場合は、長期にわたって空き状態にあるserverにとって非常に良いですが、この特性は2つのゴミ回収器(when hibernating and shortly after waking up)を使用します.、非常に多くのイベントマネージャを処理するのに適していません.いずれかのイベント処理がhibernateに戻るとevent managerはスリープ状態になります.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
start_link() -> Result
start_link(EventMgrName) -> Result
Types:EventMgrName = {local,Name} | {global,GlobalName} | {via,Module,ViaName}
Name = atom()
GlobalName = ViaName = term()
Result = {ok,Pid} | {error,{already_started,Pid}}
 Pid = pid()

     イベントマネージャプロセス(event_manager)を作成します.この関数はsupervisorによって呼び出され、event_managerがsupervisorに接続されることを保証します.
  EventMrName={local,Name}の場合、event managerはregister/2で登録するようにローカルに登録されます.
  EventMrName={global,GlobalName}の場合、event managerはglobal:register_name/2で登録するようにローカルに登録されます.
  Nameを指定しないと登録されません.
  EventMrName={via,Module,ViaName}event managerがModuleで定義したregister_name/2,unregister_name/1,whereis_name/1 and send/2を使用する場合、これらの関数の機能はglobalの機能と一致します.そうしないと{via,Module,ViaName}は役に立たない
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
start() -> Result
start(EventMgrName) -> Result
 
Types:
EventMgrName = {local,Name} | {global,GlobalName} | {via,Module,ViaName}
 Name = atom()
 GlobalName = ViaName = term()
Result = {ok,Pid} | {error,{already_started,Pid}}
 Pid = pid()

   モニタツリーがないなど、独立したevent managerプロセスを作成します.start_link/0を参照してください.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
a
add_handler(EventMgrRef, Handler, Args) -> Result
 
Types:
EventMgr = Name | {Name,Node} | {global,GlobalName} | {via,Module,ViaName} | pid()
 Name = Node = atom()
 GlobalName = ViaName = term()
Handler = Module | {Module,Id}
 Module = atom()
 Id = term()
Args = term()
Result = ok | {'EXIT',Reason} | term()
 Reason = term()

    イベントマネージャに新しいイベントコールバック(event handler)を追加すると、Module:init/1が呼び出されてステータスが初期化されます.
    EventMgrパラメータは、pid()、Name,{Name,Node}(このイベント管理が他のノードに登録されている場合){global,GlobalName}{via,Module,ViaName}
ArgsパラメータはModule:init/1に渡されて使用されます
Module:init/1が正しい値を返すと、event managerはevent handlerを増加し、この関数はokを返します.
Module:init/1 Reason付きの失敗または{error,Reasion}というevent handerを返すと無視され、この関数は{'EXIT',Reason}または{error,Reason}を返す.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
add_sup_handler(EventMgrRef, Handler, Args) -> Result
 
Types:
EventMgr = Name | {Name,Node} | {global,GlobalName} | {via,Module,ViaName} | pid()
 Name = Node = atom()
 GlobalName = ViaName = term()
Handler = Module | {Module,Id}
 Module = atom()
 Id = term()
Args = term()
Result = ok | {'EXIT',Reason} | term()
 Reason = term()
   
   add_handler/3と同様にevent handlerが追加されますが、event handlerと呼び出されたプロセスとの間に監視接続(supervise ther connection)が追加されます.
このプロセスterminateswith Reason event managerがModule:terminate/2{stop,Reason}でこのevent handlerを削除する場合
event handlerが削除された場合、event managerはプロセス(the calling process)に{gen_event_EXIT,Handler,Reason}を送信します.このときのReasonは次のようになります.
 
  •    1)normal----delete_を使うhandler/3またはremove_handler
  •    2)shutdown ---event_manager終了:is terminating
  •    3){swapped,NewHandler,Pid}swap_を使用する場合handler/3またはswap_sup_handler/3置換元event handler
  •    4)一つのtermが一つのエラーで除去された場合
  • %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
    notify(EventMgrRef, Event) -> ok
     
    sync_notify(EventMgrRef, Event) -> ok
     
    Types:
    EventMgrRef = Name | {Name,Node} | {global,GlobalName} | {via,Module,ViaName} | pid()
     Name = Node = atom()
     GlobalName = ViaName = term()
     Event = term()

        event managerに追加されたすべてのevent handlerにEvent(MSG)を送信します.event managerはすべてのevent handlerを呼び出すModule:handler_event/2.
        notifyは非同期です.メッセージが送信された後、すぐに戻ります.sync_notify同期は、すべてのevent_にあります.handlerはメッセージを処理してokに戻る.
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    call(EventMgrRef, Handler, Request) -> Result
    call(EventMgrRef, Handler, Request, Timeout) -> Result
     
    Types:
     
    EventMgrRef = Name | {Name,Node} | {global,GlobalName} | {via,Module,ViaName} | pid()
     Name = Node = atom()
     GlobalName = ViaName = term()
     Handler = Module | {Module,Id}
     Module = atom()
     Id = term()
     Request = term()
     Timeout = int()>0 | infinity
     Result = Reply | {error,Error}
     Reply = term()
     Error = bad_module | {'EXIT',Reason} | term()
     Reason = term()

       同期call(gen_server:callとは差が少ない)ですが、Request.Handler内でhandler_を使用するには対応するHanderを指定します.コール/2はRequestを処理する.
        TimeOutは0より大きいミリ秒レベルまたはinfinity.のデフォルト値が50000 ms.所定時間内に返されない場合はcall fails.
        RepealはModule:handleを返します.call/2は戻る、event handlerがインストールされていなければ{error,bad_module}.callbackはそれぞれReason Termを返し、この関数は{error,{'EXIT',Reason},{error,Term}を返す.
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    delete_handler(EventMgrRef, Handler, Args) -> Result
     
    Types:
    EventMgrRef = Name | {Name,Node} | {global,GlobalName} | {via,Module,ViaName} | pid()
     Name = Node = atom()
     GlobalName = ViaName = term()
    Handler = Module | {Module,Id}
     Module = atom()
     Id = term()
    Args = term()
    Result = term() | {error,module_not_found} | {'EXIT',Reason}
     Reason = term()

       event manager(EvenMgrRef)の対応するHandlerを削除し、Handler:terminate(Args,State)を呼び出してこのイベントを終了する.
    Result:Handler:terminate(Args,State)の戻り値を返し、インストールイベントが見つからなければ{error,module_not_found}を返す.
       失敗するとReasonに戻ります.この関数は{'EXIT',Reason}を返します.
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    swap_handler(EventMgrRef, {Handler1,Args1}, {Handler2,Args2}) -> Result
     
    Types:
    EventMgrRef = Name | {Name,Node} | {global,GlobalName} | {via,Module,ViaName} | pid()
     Name = Node = atom()
     GlobalName = ViaName = term()
     Handler1 = Handler2 = Module | {Module,Id}
     Module = atom()
     Id = term()
     Args1 = Args2 = term()
     Result = ok | {error,Error}
     Error = {'EXIT',Reason} | term()
     Reason = term()

    event manager(EventMgref)ではHandler 2の代わりにHandler 1を用いる
  • )Handler 1-を削除---呼び出しdelete_handlerと一致:
  • 2)Handler 2-----add_handler呼び出しと一致する:【init内呼び出し{Args 2,Term}:TermはHandler 1:terminate内で返される】
  • )この2つの操作は原子性がなく,1,2の成功は関係ない.
  • %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    swap_sup_handler(EventMgrRef, {Handler1,Args1}, {Handler2,Args2}) -> Result
     
    Types:
    EventMgrRef = Name | {Name,Node} | {global,GlobalName} | {via,Module,ViaName} | pid()
     Name = Node = atom()
     GlobalName = ViaName = term()
     Handler1 = Handler 2 = Module | {Module,Id}
     Module = atom()
     Id = term()
     Args1 = Args2 = term()
     Result = ok | {error,Error}
     Error = {'EXIT',Reason} | term()
     Reason = term()

        swap_handler/3と一致するが、Handler 2とthe calling processで接続が確立する.
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    which_handlers(EventMgrRef) -> [Handler]
     
    Types:
     EventMgrRef = Name | {Name,Node} | {global,GlobalName} | {via,Module,ViaName} | pid()
     Name = Node = atom()
     GlobalName = ViaName = term()
     Handler = Module | {Module,Id}
     Module = atom()
     Id = term()

       イベントマネージャのイベントEvent handlerリストを返します
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    stop(EventMgrRef) -> ok
     
    Types:
    EventMgrRef = Name | {Name,Node} | {global,GlobalName} | {via,Module,ViaName} | pid()
    Name = Node = atom()
    GlobalName = ViaName = term()

    terminates the event managerはその前にインストールしたイベントに対してModule:terminate(stop,...)を呼び出す.
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    event handlerのcallback関数
    
    Module:init(InitArgs) -> {ok,State} | {ok,State,hibernate} | {error,Reason}
    Types:
    InitArgs = Args | {Args,Term}
    Args = Term = term()
    State = term()
    Reason = term()

        新しいevent handlerがevent managerに追加されると、この関数が呼び出されます.
        gen_event:add_sup_handler/3,swap_handler/3 swap_sup_handlerを呼び出す
        {ok,State,hibernate}を返すとevent managerはスリープ状態になります:次のイベントの発生を待つ
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    Module:handle_event(Event, State) -> Result
     
    Types:
    Event = term()
    State = term()
    Result = {ok,NewState} | {ok,NewState,hibernate} | {swap_handler,Args1,NewState,Handler2,Args2} | remove_handler
    NewState = term()
    Args1 = Args2 = term()
    Handler2 = Module2 | {Module2,Id}
    Module2 = atom()
    Id = term

         event managerがnotify/2またはsync_notify/2で送信されたメッセージを受信すると、インストールされたすべてのイベントのHandler:handler_event/2が呼び出されます.
         {swap_handler,Args 1,NewState,Handler 2,Args 2}を返すとTerm=Module:terminate(Args 1,NewState)、Module 2:init(Args 2,Term)【基本はswap_handler/3と同じ】
         remove_handlerを返すとModule:terminate(remove_handler,State)が呼び出されます.
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    Module:handle_call(Request, State) -> Result
     
    Types:
    Request = term()
    State = term()
    Result = {ok,Reply,NewState} | {ok,Reply,NewState,hibernate}| {swap_handler,Reply,Args1,NewState,Handler2,Args2}| {remove_handler, Reply}
     Reply = term()
     NewState = term()
     Args1 = Args2 = term()
     Handler2 = Module2 | {Module2,Id}
      Module2 = atom()
      Id = term()

    gen_event:call/3からのメッセージはhandle_eventと似ていますが、同期されています.
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    Module:handle_info(Info, State) -> Result
     
    Types:
    Info = term()
    State = term()
    Result = {ok,NewState} | {ok,NewState,hibernate}
     | {swap_handler,Args1,NewState,Handler2,Args2} | remove_handler
     NewState = term()
     Args1 = Args2 = term()
     Handler2 = Module2 | {Module2,Id}
      Module2 = atom()
      Id = term()

         gen_event:call/3、gen_event:notify/3、gen_event:sync_notify/3以外のメッセージが受信されました.
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    Module:terminate(Arg, State) -> term()
     
    Types:
    Arg = Args | {stop,Reason} | stop | remove_handler
     | {error,{'EXIT',Reason}} | {error,Term}
     Args = Reason = Term = term()

    削除を完了するには、クリーンアップ作業時に呼び出されます.
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    Module:code_change(OldVsn, State, Extra) -> {ok, NewState}
     
    Types:
    OldVsn = Vsn | {down, Vsn}
    Vsn = term()
    State = NewState = term()
    Extra = term()

    バージョンを更新して使って、これはずっと分からないで、どうせ今誰も使っていません