Saling Saling Import Pakej Bersih dan Pengesanan Kebuntuan
Dalam program Go, jika operasi saluran menyekat semasa program sedang berjalan, atur cara akhirnya akan menerima ralat "kebuntuan". Walau bagaimanapun, tingkah laku berubah apabila pakej bersih diimport.
Coretan kod yang dimaksudkan:
<code class="go">package main import ( "fmt" "net/http" ) func main() { var ch = make(chan int) ch <- 1 }</code>
Jika pakej net/http tidak diimport, atur cara akan keluar dengan "kematian "kesilapan. Ini kerana operasi saluran (menghantar ke saluran tidak buffer) menyekat selama-lamanya, dan tiada goroutine lain berjalan untuk melaksanakan operasi tak segerak yang akan membolehkan pengesan jalan buntu mengenal pasti isu tersebut.
Walau bagaimanapun, apabila net/http pakej diimport, program tidak menemui jalan buntu. Ini kerana mengimport pakej bersih memulakan tinjauan latar belakang Goroutines yang melumpuhkan pengesan jalan buntu dengan berkesan.
Pakej bersih termasuk kefungsian untuk mengurus sambungan rangkaian dan ia menggunakan Goroutines untuk mengendalikan sambungan secara tidak segerak. Tinjauan latar belakang Goroutines ini terus berjalan walaupun tiada sambungan HTTP sedang diwujudkan atau diproses, yang menjadikan program kelihatan tidak menyekat kepada pengesan jalan buntu. Akibatnya, program tidak keluar dengan ralat "kebuntuan", walaupun operasi saluran disekat.
Tingkah laku ini telah dibincangkan dalam isu GitHub https://github.com/golang/go/issues /12734.
Atas ialah kandungan terperinci Bagaimanakah Pakej Bersih Mempengaruhi Pengesanan Deadlock dalam Program Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!