클라이언트 처리 프로세스가 감독자 트리에 추가되어야합니까?

StackOverflow https://stackoverflow.com/questions/152744

  •  02-07-2019
  •  | 
  •  

문제

Erlang에는 TCP/IP 연결을 받아들이는 프로세스를 포함하는 감독관 트리가 있습니다. 들어오는 연결에 대해 새로운 프로세스를 생성합니다. 이 과정이 감독자 트리에 추가되어야합니까?

안부, 스티브

도움이 되었습니까?

해결책

예, 응용 프로그램이 중지 될 때 올바르게/우아하게 종료되기를 원할 때이 프로세스를 감독 신청에 추가해야합니다. (그렇지 않으면 응용 프로그램 인프라가 종료되었으므로 연결되는 연결이 유출됩니다).

당신은 a를 만들 수 있습니다 simple_one_for_one 전략 감독자는 말한다 yourapp_client_sup 아이 사양이 있습니다 {Id, {yourapp_client_connection, start_link_with_socket, []}, Restart, Shutdown, worker, temporary}. 그만큼 temporary 연결 핸들러에 대한 유용한 재시작 전략이 일반적으로 없으므로 여기에 유형이 중요합니다. 클라이언트에 연결하여 연결을 다시 시작할 수 없습니다. temporary 여기서 감독자는 연결 처리기 종료를보고하지만 그렇지 않으면 무시합니다.

그 과정 gen_tcp:accept 그런 다음 수행하여 연결 처리기 프로세스를 만듭니다 supervisor:start_child(yourapp_client_sup, [Socket,Options,...]) 보다는 yourapp_client_sup:start_link(Socket, Options, ...). 확인하십시오 youreapp_client_connection:start_link_with_socket 기능은 어린이를 통해 시작합니다 gen_server 또는 proc_lib 함수 (요건의 요구 사항 supervisor 모듈) 및 기능은 소켓의 제어를 어린이에게 전달합니다. gen_tcp:controlling_process 그렇지 않으면 아이가 소켓을 사용할 수 없습니다.

다른 접근 방식은 더미를 만드는 것입니다 yourapp_client_sup 그것을 처리하십시오 yourclient_connection_handler 프로세스는 AT 스타트 업에 연결할 수 있습니다. 그만큼 yourapp_client_sup 프로세스는 전파하기 위해 존재합니다 EXIT 부모에서 연결 처리기 프로세스로의 메시지. 함정이 존재하고 모든 것을 무시해야합니다 EXIT 부모의 메시지 이외의 메시지. 전체적으로, 나는 사용하는 것을 선호합니다 simple_one_for_one 감독자 접근.

다른 팁

이러한 프로세스가 많을 것으로 예상되는 경우, 주 감독자 아래에 감독자를 추가하여 책임을 분리하는 것이 좋습니다 (그리고 아마도 simple_one_for_one 상황을 더 간단하게 만들고 현재 케이스보다 간단하게 설정합니다).

문제는 이러한 프로세스를 제어해야한다면 항상 감독자가있는 것이 좋습니다. 그들이 성공 여부에 관계없이 중요하지 않다면, 당신은 하나가 필요하지 않을 수 있습니다. 그러나 다시, 나는 항상 그것이 조잡한 코딩이라고 주장합니다. ;-)

유일한 것 그렇지 않을 것입니다 그들이 어디에서 왔는지 매우 분명하지 않고 상당히 적지 않는 한, 기존 나무에 추가하는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top