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 중국어 웹사이트의 기타 관련 기사를 참조하세요!