"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Go에서 실행 중인 고루틴을 정상적으로 종료하는 방법은 무엇입니까?

Go에서 실행 중인 고루틴을 정상적으로 종료하는 방법은 무엇입니까?

2024-11-04에 게시됨
검색:247

How to Gracefully Terminate a Running Goroutine in Go?

고루틴 종료 신호 보내기

Go에서는 애플리케이션을 정상적으로 종료하거나 리소스 할당을 관리할 때 고루틴 종료를 처리하는 것이 중요할 수 있습니다. 이 기사에서는 실행 중인 고루틴에 신호를 보내 실행을 중지하는 기술을 살펴봅니다.

문의에 제공된 예는 연속 처리를 시뮬레이션하면서 무한 루프를 수행하는 고루틴을 보여줍니다. 목표는 지정된 시간 초과를 초과하는 경우 이 고루틴을 종료하는 것입니다.

초기 접근 방식에는 두 개의 채널을 사용하는 것이 포함됩니다. 하나는 통신용이고 다른 하나는 신호 종료용입니다. 그러나 신호 채널에서 읽으면 고루틴이 차단되어 의도한 목적이 무산됩니다.

추가 중지 채널 사용

한 가지 효과적인 솔루션은 추가 중지 채널을 도입하는 것입니다. , tooLate, 유형 chan struct{}. 고루틴 내부에서는 통신 채널과 중지 채널을 모두 모니터링하는 데 select 문이 사용됩니다. tooLate 채널이 값을 수신하면 goroutine이 정상적으로 반환되어 처리 루프를 종료합니다.

수정된 코드 조각은 다음과 같습니다.

func main() {
    // tooLate channel to signal goroutine to stop
    tooLate := make(chan struct{})
    proCh := make(chan string)

    go func() {
        for {
            fmt.Println("working")
            time.Sleep(1 * time.Second)

            select {
            case 

이 솔루션에서는 proCh 채널이 통신에 계속 사용되는 반면 tooLate 채널은 종료 신호 역할을 합니다. tooLate 채널이 닫히면 고루틴은 이를 감지하고 루프를 종료합니다.

기타 고려 사항

추가 채널을 사용하는 것 외에도 고루틴 신호를 보내는 대체 접근 방식이 있습니다. 예를 들어 고루틴 동기화를 보다 세밀하게 제어하려면 내장된 sync.Cond 유형을 사용하는 것이 좋습니다. 기술 선택은 애플리케이션의 특정 요구 사항에 따라 달라집니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3