기본 종료 또는 미러링된 쿼리 반환에서 해결되지 않은 고루틴
Go 프로그래밍 언어 책에서 검색하기 위해 고루틴이 생성되는 코드 조각을 고려하세요. 여러 URL의 응답. 기본 고루틴은 응답 채널에서 가장 빠른 응답을 받은 후 종료됩니다. 질문이 생깁니다: 메인 또는 상위 고루틴이 종료되거나 반환될 때 완료되지 않은 고루틴은 어떻게 되나요?
메인 고루틴 종료
정상적인 상황에서 메인 고루틴이 종료될 때( 반환) 전체 런타임 시스템이 종료됩니다. 결과적으로, 버퍼링되지 않은 채널이나 전체 채널에서 보내기를 기다리는 고루틴은 취소, 실행 또는 대기 없이 갑자기 존재하지 않게 됩니다. 이는 플래시 종이가 점화되는 것과 유사합니다.
이를 고루틴 누출이라고 부를 수도 있으며, 이는 다른 맥락에서 닫히지 않거나 해제되지 않은 리소스와 유사합니다. 그러나 전체 프로세스가 종료되므로 실제 누출은 없습니다. 리소스는 무기한으로 유지되지 않습니다. 시스템은 본질적으로 빠른 정리를 수행합니다.
메인 고루틴 실행 시 미러링된 쿼리 반환
메인 고루틴이 종료되지 않았고 mirroredQuery() 함수가 반환된 경우, 나머지 고루틴은 작업을 완료하고 돌아올 때까지 실행을 계속하거나 기다립니다. 여기에는 응답 대기, 채널로 전송 및 반환이 포함됩니다. 반환되면 종료되고 증발됩니다.
채널 자체는 문자열을 유지하면서 존재하며, 이는 사소한 리소스 누출로 간주될 수 있습니다. 그러나 채널에 대한 마지막 참조가 사라지면 이 누출이 해결되어 채널(및 해당 콘텐츠)이 가비지 수집됩니다.
버퍼링되지 않은 채널
코드 조각의 채널이 버퍼링되지 않으면 느린 고루틴이 채널로 전송을 시도하는 동안 차단됩니다. 이렇게 하면 종료를 방지하고 프로그램이 종료될 때까지 할당된 채널과 리소스를 유지합니다. 이런 상황은 바람직하지 않습니다.
버퍼 채널 및 가장 깔끔한 코드
코드 조각에서 버퍼 채널을 사용하는 것은 잠재적인 오류나 오류 없이 원하는 기능을 보장하는 가장 간단한 접근 방식입니다. 리소스 누출. 이는 느린 고루틴이 작업을 완료하고 우아하게 종료할 수 있도록 합니다.
결론
메인 출구에서 완료되지 않은 고루틴의 운명은 갑작스러운 종료입니다. 기본 고루틴이 계속 실행되는 동안 미러링된 쿼리가 반환되면 나머지 고루틴은 작업을 완료하고 증발합니다. 버퍼링된 채널을 사용하면 이 맥락에서 완료되지 않은 고루틴과 관련된 잠재적인 리소스 누수를 해결합니다.
위 내용은 Main Go 루틴이 종료되면 완료되지 않은 고루틴은 어떻게 되나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!