2012-10-27 4 views
2

수퍼바이저는 모니터와 동일합니까? 모니터를 사용하는 것이 좋습니까, 아니면 감독관을 사용하는 것이 더 좋을까요?모니터 대 감독자?

감독자 대신 모니터를 사용해야하는 경우를 확실히 알지 못합니다.

답변

6

연구 교재는 : http://learnyousomeerlang.com/errors-and-processes#monitors

감독자는 아주 특별한 관계이다. 의인화 된 형태로, 감독관으로서 나는 부하 직원의 복지에 직접적인 책임이있다. 그/그녀가 실패하면, 상황을 해결하기 위해 뭔가해야합니다.

링크는 동일한 시스템의 일부인 감독자 및 기타 직접 관련 프로세스에서 사용됩니다.

모니터는 눈에 띄지 않지만 내 눈에는 링크와 유사하지만 프로세스가 실행 중인지 직접 관심이없는 외부 프로세스에 유용합니다.

예를 들어 DNS를 사용하려면 응답을 얻으려고 시간을 낭비하기 전에 DNS 서버가 실행 중인지 알면 도움이되지만 DNS 서버가 다운되면 시작하는 것이 내 일이 아닙니다. 백업. 난 그냥 다른 DNS 서버로 전환해야합니다.

1

관리자은 OTP 동작입니다. 계층 구조의 맨 위에는 각 하위에 대해 정의한 재시작 전략을 적용하는 책임자 인 감독자가 프로세스 계층에서 사용합니다.

자녀는 다른 감독자 또는 근로자가됩니다.

작업자는 작업을 수행하는 모듈입니다. OTP 아키텍처에서 그들은 보통 gen_server, gen_event, gen_fsm입니다 ... 그들은 정상적으로 종료 될 수 있습니다 (이 경우에는 아무것도 수행되지 않습니다). 과정 one_for_all

  • 를 다시 시작합니다 :

    • one_for_one : 감독자는 다시 시작 전략을 적용하는 모든 아이들을 종료하고 다시 시작합니다 모든
    • rest_for_one : 시작에서 다음 아이들을 종료 목록을 만들고 올바른 순서로 다시 시작하십시오.

    이렇게하려면 감독자는 bi-di 링크 또는 spawn_link 함수에 의해 생성 된 상호 작용 연결. 2 개의 프로세스가 링크됩니다. 그 중 하나가 충돌하는 경우, 그것은 process_flag(trap_exit, true)를 설정하지 않으면 다른 하나는, 또한 충돌하고이 경우에는 메시지 여기 {'EXIT',FromPid,Reason}

    을 받게된다는 것을 의미합니다 내 경우에는 (3 감독자와 같은 계층 구조의 예입니다 Task_Sup)는 simple_one_for_one 전략을 사용하고 Mngr_Server에서 (작업)을 작성하여 생성 된 아이들은 같은 Mngr_server는 각 자녀를 모니터링합니다

    enter image description here

    모니터

    를 호출하여 생성이 개 프로세스 사이의 단방향 연결입니다프로세스 Pid1에서

    Ref = erlang:monitor(process, Pid2).다음 PID2를 종료 할 경우, PID 1은

    {'DOWN', Ref, process, Pid2, Reason} 
    

    PID1이 PID2 종료를 통보받을 들어오는 메시지를 확인해야 메시지가 나타납니다.