클라이언트 처리 프로세스가 감독자 트리에 추가되어야합니까?
-
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
상황을 더 간단하게 만들고 현재 케이스보다 간단하게 설정합니다).
문제는 이러한 프로세스를 제어해야한다면 항상 감독자가있는 것이 좋습니다. 그들이 성공 여부에 관계없이 중요하지 않다면, 당신은 하나가 필요하지 않을 수 있습니다. 그러나 다시, 나는 항상 그것이 조잡한 코딩이라고 주장합니다. ;-)
유일한 것 그렇지 않을 것입니다 그들이 어디에서 왔는지 매우 분명하지 않고 상당히 적지 않는 한, 기존 나무에 추가하는 것입니다.