>백엔드 개발 >Golang >Go 루틴 통신에서 Go의 '모든 Goroutines Are Sleep' 교착 상태를 해결하는 방법은 무엇입니까?

Go 루틴 통신에서 Go의 '모든 Goroutines Are Sleep' 교착 상태를 해결하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-14 11:20:19338검색

How to Resolve Go's

Go의 교착 상태: "모든 고루틴이 절전 모드로 설정되어 있음" 이해 및 해결

제공된 Go 코드 스니펫에서 다음으로 인해 교착 상태가 발생합니다. 고루틴 통신에 대한 오해. 이 프로그램은 트럭 하역을 처리하기 위해 고루틴을 사용하여 트럭의 하역을 시뮬레이션하는 것을 목표로 합니다. 그러나 로드 프로세스가 완료되면 코드가 트럭 채널(ch)을 닫지 못하여 교착 상태가 발생합니다.

이 교착 상태를 해결하려면 모든 트럭이 로드된 후 트럭 채널(ch)을 닫는 것이 중요합니다. 로드되었습니다. 이는 UnloadTrucks goroutine에 더 이상 트럭이 보내지지 않아 돌아올 수 있다는 신호를 보냅니다.

이를 달성하는 한 가지 방법은 다음 코드에서 설명하는 것처럼 WaitGroup을 사용하는 것입니다.

// Define a WaitGroup to track the completion of the loading goroutines
var wg sync.WaitGroup

// Start goroutines to load trucks
go func() {
    // Load trucks and send them over the truck channel
    for t := range trucks {
        go func(tr Truck) {
            itm := Item{}
            itm.name = "Groceries"

            fmt.Printf("Loading %s\n", tr.name)
            tr.Cargo = append(tr.Cargo, itm)
            ch <- tr

            wg.Done() // Signal the WaitGroup that the loading is complete
        }(trucks[t])
    }
}()

// Use the WaitGroup to wait for all loading goroutines to complete
wg.Wait()

// Close the truck channel after all loading is finished
close(ch)

// Start the UnloadTrucks goroutine
UnloadTrucks(ch)

모든 트럭이 로드된 후 트럭 채널(ch)을 닫으면 UnloadTrucks 고루틴이 종료되어 교착 상태가 해제됩니다. 이제 프로그램이 성공적으로 완료되어 의도한 대로 모든 트럭이 하역됩니다.

위 내용은 Go 루틴 통신에서 Go의 '모든 Goroutines Are Sleep' 교착 상태를 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.