2017-02-10 11 views
1

관리자가 gen_server를 시작하면서 Erlang 응용 프로그램을 사용하고 있습니다. 생성 된 gen_server는 init/1에 새로운 프로세스를 감독자에게 전달하는 논리를 가지고 있습니다. 초기화/1 응용 프로그램 내부Erlang : 관리자를 사용하여 gen_server : init/1에 새 하위를 추가하십시오. start_child/2가 응용 프로그램을 중단합니다.

supervisor:start_child(supervisor_name, Child_spec), 

단지와 함께이 작업을 수행 끊었. 내가 사용하는 경우에,

rpc:cast(node(), supervisor, start_child, [supervisor_name, Child_spec]), 

다음 응용 프로그램이 원활하게 실행. 어느 누구도이 상황을 디버깅 할 수있는 아이디어를 얻을 수 없으며 통찰력을 매우 높이 평가할 수 있습니다.

답변

2

감독자가 차례대로 자식 프로세스를 시작하고 각 자식 프로세스가 다음 프로세스를 시작하기 전에 초기화를 완료하기를 기다리기 때문에 이러한 상황이 발생합니다.

즉 감독자에게 gen_server 모듈의 시작 기능 (예 : {my_module, start_link, []})이 제공됩니다. 그 함수가 돌아올 때까지 기다릴 것이고, 다른 요청은 처리하지 않을 것입니다. my_module:start_link/0gen_server:start_link/4을 호출하며, 콜백 함수 my_module:init/1이 한 번만 반환됩니다.

my_module:init/1 그러나 my_module:init/1이 돌아 오기를 기다리고 있고 관리자가 교착 상태에 빠져 있기 때문에 감독자에게 차단 호출을합니다.

rpc:cast과 작동하는 이유는 rpc:cast이 함수가 반환 될 때까지 대기하지 않으므로 교착 상태가 발생하지 않기 때문입니다.


당신이 당신의 gen_server init 콜백 함수에 새로운 아이 사양을 추가해야합니까? 수퍼바이저 init 함수에 두 하위 사양을 모두 추가하면 하나씩 시작할 수 있습니다.

+0

두 번째 프로세스를 후킹할지 여부를 결정해야합니다. 또는 첫 번째 프로세스의 init/1에서 두 번째 프로세스에 몇 가지 인수를 전달해야합니다. 하지만 Erlang 어플리케이션에서 이러한 교착 상태를 어떻게 알 수 있습니까? 방법이 있습니까? 감사. –