Erlang OTP gen_event (0)
元の英語ドキュメント: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はスリープ状態になります.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
イベントマネージャプロセス(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}は役に立たない
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
モニタツリーがないなど、独立したevent managerプロセスを作成します.start_link/0を参照してください.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
a
イベントマネージャに新しいイベントコールバック(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_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が一つのエラーで除去された場合 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
event managerに追加されたすべてのevent handlerにEvent(MSG)を送信します.event managerはすべてのevent handlerを呼び出すModule:handler_event/2.
notifyは非同期です.メッセージが送信された後、すぐに戻ります.sync_notify同期は、すべてのevent_にあります.handlerはメッセージを処理してokに戻る.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
同期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}を返す.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
event manager(EvenMgrRef)の対応するHandlerを削除し、Handler:terminate(Args,State)を呼び出してこのイベントを終了する.
Result:Handler:terminate(Args,State)の戻り値を返し、インストールイベントが見つからなければ{error,module_not_found}を返す.
失敗するとReasonに戻ります.この関数は{'EXIT',Reason}を返します.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
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_handler/3と一致するが、Handler 2とthe calling processで接続が確立する.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
イベントマネージャのイベントEvent handlerリストを返します
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
terminates the event managerはその前にインストールしたイベントに対してModule:terminate(stop,...)を呼び出す.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
event handlerのcallback関数
新しいevent handlerがevent managerに追加されると、この関数が呼び出されます.
gen_event:add_sup_handler/3,swap_handler/3 swap_sup_handlerを呼び出す
{ok,State,hibernate}を返すとevent managerはスリープ状態になります:次のイベントの発生を待つ
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
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)が呼び出されます.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
gen_event:call/3からのメッセージはhandle_eventと似ていますが、同期されています.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
gen_event:call/3、gen_event:notify/3、gen_event:sync_notify/3以外のメッセージが受信されました.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
削除を完了するには、クリーンアップ作業時に呼び出されます.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
バージョンを更新して使って、これはずっと分からないで、どうせ今誰も使っていません
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は次のようになります.
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を用いる
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()
バージョンを更新して使って、これはずっと分からないで、どうせ今誰も使っていません