erlang 4 대 behavior 의 3 - genevent
27867 단어 erlang
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).
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Instalando o Elixir e o Erlang com o gerenciador de versões asdfEsse tutorial usa o gerenciador de versões asdf, mas fique a vontade para utilizar outros se preferir. Infelizmente o as...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.