2011-03-30 7 views
2

여기에 무슨 일이 일어나고 있는지 이해하려고합니다 : MaxR, MaxT 메커니즘을 트리거하지 않고 하나의 클라이언트를 주기적으로 다시 시작하는 관리자가 있습니다. 클라이언트는 속도 제한을 실행하지 않을 정도로 천천히 충돌합니다.자녀를 다시 시작하는 동안 수퍼바이저가 통화를 차단합니까?

supervisor:which_children/1delete_child/2, start_child/2을 사용하여 자식 세트를 현실에 맞게 조정하는 장치가있었습니다 (장치 당 하나의 감독자 자식을 찾으려고하는 USB 장치를 검색 할 때).

이것은 일반적으로 속도 제한에 대한 안전망처럼 동작하지만 이상하게도 자식을 삭제하고 시작하는 메커니즘이 전혀 호출되지 않은 것처럼 보입니다.

무슨 일이 일어나고 있는지 알기 위해 나는 쉘에서 supervisor:which_children/1이라고 부르며 전화가 차단되고 결코 돌아 오지 않는 것처럼 보입니다.

자녀를 다시 시작하려고하는 동안 수퍼바이저에 대한 통화가 차단 될 수 있습니까?

부록 : 충돌이 자식 시작할 때 발생하는 것 같습니다

:

=SUPERVISOR REPORT==== 29-Mar-2011::21:36:20 === 
    Supervisor: {local,gateway_sup} 
    Context: start_error 
    Reason:  {'EXIT',{timeout,{gen_server,call,[<0.155.0>,late_init]}}} 
    Offender: [{pid,<0.76.0>}, 
       {name,gw_3_5}, 
       {mfa,{channel,start_link, 
          [[{gateways,[{left,108},{right,103}]}], 
          {3,5}]}}, 
       {restart_type,transient}, 
       {shutdown,10000}, 
       {child_type,worker}] 
+0

자식의 'start_link' 함수에서'gen_server : call'을하고 있습니까? –

+0

예. gen_server가 이미 실행 된 후에 수행해야하는 늦은 초기화가 필요합니다. –

+0

대신'init' 함수에서이 작업을 수행하지 않으시겠습니까? 여기서 죽은 자물쇠에 대한 위험이있을 수 있습니다 ... –

답변

1

토론 외에 질문에 대한 답변은 다음과 같습니다

중에 실패 아이를 다시 시작하는 경우 프로세스 내부에서 수퍼바이저 루프를 시작합니다 (내부적으로 gen_server 임). API 호출을 처리하지 않습니다.

감독자의 속도 제한이 아이들의 시작 오류에서 시작되지 않도록 구성되면 특히 나쁩니다. 필자의 예에서는 느린 시작 (특히 오류시)이 있습니다.

감독자가 반복적으로 아이를 재시동하려고 시도 할 경우, 어떤 아이디를 호출해도 도달 할 수 없으며 일반적으로 좋지 않습니다.

+1

가장 좋은 방법은 프로세스를 시작한 후 가능한 한 간단한 초기화 단계를 위해 노력하고 나머지는 수행하는 것입니다. 이것의 이점은 두 가지입니다. 첫째, 감독자는 가능한 한 적게 참여하고 (많은 재시작 및 긴 init 단계가있는 것을 발견 했으므로 차단되지 않습니다.) 두 번째로 감독자가 프로세스를 감독함으로써 시작 (이후 설정에서 문제가 발생하면 관리자가 처리합니다). –

+0

아멘이에요! 나는 복잡한'init' 콜백 (다른 프로세스 시작, 파일 읽기 등)에 대해 매우 불쾌한 경험을했습니다. – gregorej