> 백엔드 개발 > Golang > 모든 고루틴이 완료된 후 Go 프로그램을 어떻게 정상적으로 종료할 수 있나요?

모든 고루틴이 완료된 후 Go 프로그램을 어떻게 정상적으로 종료할 수 있나요?

Patricia Arquette
풀어 주다: 2024-12-06 04:45:10
원래의
604명이 탐색했습니다.

How Can I Gracefully Exit a Go Program After All Goroutines Have Finished?

Go 루틴을 적절하게 기다려서 정상적인 프로그램 종료 보장

Go 루틴을 사용할 때는 프로그램을 종료하기 전에 완료되었는지 확인하는 것이 중요합니다. . 루틴이 끝날 때까지 기다리는 메커니즘을 이해하면 효과적으로 구현할 수 있습니다.

"<-done" 메커니즘 공개

기다림의 핵심 Go 루틴은 차단 작업인 "<- done" 문을 사용하고 있습니다. 이는 값이 채널로 전송될 때까지 프로그램이 일시 중지됨을 의미합니다. 제공한 예에서 "done" 채널은 "do_stuff" 루틴의 완료를 알리는 데 사용됩니다. "done <- true"가 실행되면 "<- done" 문이 차단 해제되어 프로그램을 계속할 수 있습니다.

적절한 동기화를 통해 교착 상태 방지

마지막 줄의 주석 처리를 해제하면 "done" 채널을 이미 한 번 읽었기 때문에 교착 상태가 발생합니다. 교착 상태는 둘 이상의 루틴이 서로 보유하는 리소스를 획득하려고 시도하여 진행을 방해하는 종속성을 생성할 때 발생합니다. 이를 방지하려면 루틴과 채널 간의 적절한 동기화를 확인하세요.

장기 실행 기능을 병렬화하려는 시나리오에서는 "동기화" 패키지가 더욱 강력한 솔루션을 제공합니다. "sync.WaitGroup" 유형을 사용하면 활성 루틴 수를 추적하고 진행하기 전에 완료될 때까지 기다릴 수 있습니다. 아래 예는 이 접근 방식을 보여줍니다.

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            longOp()
            wg.Done()
        }()
    }

    // Wait for all routines to finish
    wg.Wait()
}

func longOp() {
    time.Sleep(time.Second * 2)
    fmt.Println("Long operation completed")
}
로그인 후 복사

"sync.WaitGroup"을 사용하면 프로그램이 진행하기 전에 모든 장기 실행 기능이 완료될 때까지 기다리도록 하여 잠재적인 교착 상태를 방지할 수 있습니다. 이는 Go 루틴 조정에 대한 보다 통제된 접근 방식을 제공합니다.

위 내용은 모든 고루틴이 완료된 후 Go 프로그램을 어떻게 정상적으로 종료할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿