Mengurus Penutupan Pelayan dalam Go
Dalam Go, mengurus penutupan pelayan mendengar adalah penting untuk mengendalikan sambungan pelanggan dengan anggun dan mencegah ralat yang tidak dijangka . Artikel ini menangani cabaran untuk menghentikan pelayan mendengar dan memperkenalkan pendekatan yang mantap untuk mencapainya.
Mengenal pasti Cabaran
Apabila pelayan mendengar sambungan masuk, Terima kaedah disekat sehingga sambungan diwujudkan atau ralat berlaku. Walaupun berguna untuk menerima sambungan secara berterusan, tingkah laku menyekat ini memberikan cabaran apabila perlu menghentikan pelayan dengan anggun. Menutup soket mendengar untuk menandakan tamat operasi boleh mengakibatkan ralat yang tidak dapat dibezakan daripada ralat Terima yang lain.
Isu "FIXME"
Dalam kod yang disediakan, kaedah servis cuba mengesan ralat "penggunaan sambungan rangkaian tertutup" apabila soket mendengar ditutup, tetapi ralat ini tidak dieksport dari jaring pakej. Had ini menyukarkan untuk mengendalikan penutupan pelayan dengan anggun tanpa bergantung pada teknik pengendalian ralat yang jelek.
Pendekatan yang Lebih Baik
Untuk menangani isu ini, pendekatan yang lebih berkesan melibatkan menggunakan saluran khusus (selesai) untuk menandakan hasrat pelayan untuk berhenti. Apabila kaedah henti dipanggil, nilai dihantar ke saluran selesai.
Dalam kaedah servis, gelung Terima diubah suai untuk menyemak kehadiran isyarat dalam saluran selesai sebelum mengelog ralat Terima. Jika isyarat hadir, ralat Terima ditindas.
Kod Contoh
Coretan kod yang diubah suai di bawah menunjukkan cara pendekatan ini dilaksanakan:
// Serve method func (es *EchoServer) serve() { for { conn, err := es.listen.Accept() if err != nil { select { case <-es.done: // If we called stop() then there will be a value in es.done, so // we'll get here and we can exit without showing the error. default: log.Printf("Accept failed: %v", err) } return } go es.respond(conn.(*net.TCPConn)) } } // Stop method func (es *EchoServer) stop() { es.done <- true // We can advance past this because we gave it buffer of 1 es.listen.Close() // Now it the Accept will have an error above }
Dengan menggunakan saluran yang telah selesai, pelayan boleh mengendalikan penutupan dengan baik dengan menghantar isyarat kepada kaedah servis, yang menyekat "penggunaan sambungan rangkaian tertutup" ralat dan memastikan penutupan bersih.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menutup Pelayan Go dengan Anggun dan Mengendalikan Ralat 'Penggunaan Sambungan Rangkaian Tertutup'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!