erlang 4 대 behavior 의 3 - genevent

27867 단어 erlang
원본:http://www.cnblogs.com/puputu/articles/1689623.html
1. 이벤트 처리 규칙
OTP 에서 이벤트 관리 자 는 이벤트 가 보 낼 이름 의 대상 입 니 다. 하나의 이 벤트 는 오류, 경고, 로그 에 쓸 정보 일 수 있 습 니 다.
이벤트 관리자 에 0 개, 하나 이상 의 이벤트 프로세서 가 설치 되 어 있 습 니 다. 이벤트 관리자 가 이벤트 알림 을 받 았 을 때 이 이 벤트 는 이벤트 관리자 에 설 치 된 이벤트 프로세서 로 처 리 됩 니 다.
이벤트 관리 자 는 하나의 프로 세 스 로 이 루어 지고 이벤트 처리 기 는 리 셋 모듈 로 이 루어 집 니 다.이벤트 관리 자 는 본질 적 으로 {Module, State} 목록 을 유지 합 니 다. 모든 Module 은 하나의 이벤트 프로세서 이 고 State 는 이벤트 프로세서 의 내부 상 태 를 유지 합 니 다.
2. 예
이벤트 프로세서 의 리 셋 모듈 은 오류 정 보 를 터미널 에 기록 합 니 다.
-module(terminal_logger). -behaviour(gen_event). -export([init/1, handle_event/2, terminate/2]). init(_Args) -> {ok, []}. handle_event(ErrorMsg, State) -> io:format("***Error*** ~p~n", [ErrorMsg]), {ok, State}. terminate(_Args, _State) -> ok. 

이벤트 프로세서 의 리 셋 모듈 은 오류 정 보 를 파일 에 기록 합 니 다.
-module(file_logger). -behaviour(gen_event). -export([init/1, handle_event/2, terminate/2]). init(File) -> {ok, Fd} = file:open(File, read), {ok, Fd}. handle_event(ErrorMsg, Fd) -> io:format(Fd, "***Error*** ~p~n", [ErrorMsg]), {ok, Fd}. terminate(_Args, Fd) -> file:close(Fd). 

 
3. 이벤트 관리자 시작
호출 genevent:start_link({local, error_man})
시작 관리자, 이 함수 가 생 성 되 고 새 프로 세 스 에 연결 되 었 습 니 다. 인자 {local, error man} 이 지정 한 이름 입 니 다. 이 예 에서 이벤트 관리 자 는 부분 적 으로 error 로 등록 되 었 습 니 다.man
이름 을 무시 하면 이벤트 관리자 가 등록 되 지 않 고 PID 가 사 용 됩 니 다.이름 도 이런 형식 일 수 있 습 니 다 {global, Name}. 그러면 이벤트 관리자 의 이름 은 global: register 입 니 다.name/2 등 록 했 어 요.
이벤트 관리자 가 감시 트 리 의 일부분 이 라면 genevent:start_링크 는 반드시 사용 되 어야 합 니 다. 즉, 감시 트 리 가 작 동 되 고 gen이벤트: start 는 단독 이벤트 관리 자 를 시작 합 니 다. 즉, 이벤트 관리 자 는 모니터링 트 리 의 일부분 이 아 닙 니 다.
 
4. 이벤트 프로세서 추가
이벤트 관리 자 를 시작 하고 이벤트 프로 세 서 를 추가 하 는 방법 을 보 여 줍 니 다.
1> gen_event:start({local, error_man}).

{ok,<0.31.0>}

2> gen_event:add_handler(error_man, terminal_logger, []).

ok


gen_event:add_handler (error man, terminal logger, []) 는 errorman 프로세서 terminal 추가logger, 이벤트 관리자 호출 terminallogger: init ([]) 이 반전 함수, [] 는 매개 변수 입 니 다. init 는 {ok, State} 을 되 돌려 야 합 니 다. State 는 이벤트 프로세서 의 내부 상태 입 니 다.
init(_Args) -> {ok, []}. 

여기, init 는 입력 인자 가 필요 없습니다. terminallogger, 내부 상태 도 사용 하지 않 았 습 니 다. filelogger, 내부 상태 에서 열 린 파일 설명 자 를 저장 합 니 다.
init(File) -> {ok, Fd} = file:open(File, read), {ok, Fd}. 

 
5. 이벤트 알림
 
3> gen_event:notify(error_man, no_reply).

***Error*** no_reply

ok


error_man 은 이벤트 관리자 의 이름, noreply 는 이벤트 입 니 다. 이 벤트 는 이벤트 관리자 에 게 메시지 로 보 냅 니 다. 이 벤트 를 받 았 을 때 이벤트 관리 자 는 설 치 된 이벤트 프로세서 마다 설치 순서에 따라 handle 를 호출 합 니 다.이벤트 (Event, State), 이 함 수 는 {ok, State 1} 로 돌아 가 기 를 기대 합 니 다. State 1 은 이벤트 프로세서 의 새로운 상태 입 니 다.
terminal 에서logger 중
handle_event(ErrorMsg, State) -> io:format("***Error*** ~p~n", [ErrorMsg]), {ok, State}. 

 
filelogger 중
handle_event(ErrorMsg, Fd) -> io:format(Fd, "***Error*** ~p~n", [ErrorMsg]), {ok, Fd}. 

 
6. 이벤트 프로세서 삭제
gen_event:delete_handler (error man, terminal logger, []), 이 함 수 는 이벤트 관리자 errorman 이 터미널 을 삭제 하 라 고 메 시 지 를 보 냈 습 니 다logger 이 이벤트 프로세서, 이벤트 관리자 가 terminal 을 호출 합 니 다.logger: terminate ([], State), 인자 [] 는 deletehandler 의 세 번 째 매개 변 수 는 terminate 가 init 와 반대 방향 으로 호출 되 어 청소 작업 을 완성 하고 반환 값 이 무시 되 었 습 니 다.
terminal 에서logger 에서 청소 동작 이 없습니다.
terminate(_Args, _State) -> ok. 

 
filelogger 에서 파일 설명자 가 꺼 졌 습 니 다.
terminate(_Args, Fd) -> file:close(Fd). 

 
7. 정지
이벤트 관리자 가 정지 되면 등 록 된 이벤트 프로세서 마다 terminate/2 를 호출 할 수 있 는 기 회 를 줍 니 다. 마치 이벤트 프로세서 가 삭 제 된 것 과 같 습 니 다.이벤트 관리자 가 트 리 의 일부분 이 라면 표시 할 필요 가 없 는 정지 이벤트 관리자 입 니 다.이벤트 관리자 가 단독 프로 세 스 로 사 용 될 때 gen 을 호출 합 니 다.event:stop(error_man).

좋은 웹페이지 즐겨찾기