Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menyelesaikan Kebuntuan 'Semua Goroutine Tidur' Go dalam Komunikasi Goroutine?
Kebuntuan dalam Go: Memahami dan Menyelesaikan "Semua Goroutine Sudah Tidur"
Dalam coretan kod Go yang disediakan, kebuntuan berlaku disebabkan oleh salah faham komunikasi goroutine. Program ini bertujuan untuk mensimulasikan pemunggahan dan pemunggahan trak, menggunakan goroutin untuk mengendalikan pemunggahan trak. Walau bagaimanapun, kod tersebut gagal menutup saluran trak (ch) apabila proses pemuatan selesai, membawa kepada jalan buntu.
Untuk menyelesaikan kebuntuan ini, adalah penting untuk menutup saluran trak (ch) sebaik sahaja semua trak telah dimuatkan. Ini memberi isyarat kepada goroutine UnloadTrucks bahawa tiada lagi trak akan dihantar, membolehkannya kembali.
Salah satu cara untuk mencapai ini adalah melalui penggunaan WaitGroup, seperti yang ditunjukkan dalam kod berikut:
// 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)
Dengan menutup saluran trak (ch) setelah semua trak telah dimuatkan, goroutine UnloadTrucks dibenarkan untuk menamatkan, memecahkan kebuntuan. Program kini akan selesai dengan jayanya, memunggah semua trak seperti yang dimaksudkan.
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Kebuntuan 'Semua Goroutine Tidur' Go dalam Komunikasi Goroutine?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!