Kebuntuan dalam Go: "Semua Goroutine Tidur"
Apabila bekerja dengan goroutine, adalah penting untuk mengurus operasi saluran dengan berkesan untuk mengelakkan kebuntuan. Ini berlaku apabila semua goroutine disekat selama-lamanya, membawa kepada situasi kebuntuan.
Memahami Kod
Mari kita periksa kod yang disediakan:
Kod ini mencipta saluran jenis Lori dan melancarkan dua gorout untuk mensimulasikan trak pemuatan dengan barangan runcit dan menghantarnya ke saluran. Ia kemudian memanggil UnloadTrucks untuk mendapatkan dan mencetak kandungan trak.
Punca Kebuntuan
Isunya terletak pada ketiadaan mekanisme untuk menutup saluran ch. Apabila semua goroutine telah menghantar trak mereka ke saluran, tiada isyarat untuk menamatkan gelung dalam UnloadTrucks. Ini bermakna ch terus mendengar nilai yang tidak pernah tiba, mengakibatkan kebuntuan.
Penyelesaian
Untuk menyelesaikan kebuntuan, kita perlu menutup saluran ch secara eksplisit apabila goroutine pemuatan selesai. Kita boleh menggunakan penyegerakan.WaitGroup untuk mengira gorouti yang sedang berjalan dan menutup saluran apabila semua telah selesai:
Pengubahsuaian ini memastikan UnloadTrucks akan ditamatkan sebaik sahaja semua gorouti telah selesai memuatkan trak. Fungsi Tunggu menyekat sehingga kaunter WaitGroup mencapai sifar, menunjukkan bahawa semua goroutine telah menyelesaikan kerja mereka. Menutup saluran memberi isyarat kepada UnloadTrucks bahawa tiada lagi trak yang akan diterima, membolehkannya keluar dari gelung dengan anggun.
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Kebuntuan dalam Pergi Apabila Semua Goroutine Tidur?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!