Pakej net Go menyediakan keupayaan untuk mencipta pelayan mendengar. Walau bagaimanapun, menghentikan pelayan ini dengan anggun boleh mencabar kerana sifat menyekat dengar.Kaedah terima.
Satu pendekatan biasa untuk menghentikan pelayan ialah menutup soket mendengar. Walau bagaimanapun, ini boleh mengakibatkan ralat yang tidak dapat dibezakan daripada ralat tulen semasa penerimaan sambungan. Akibatnya, coretan kod berikut mempamerkan isu ini:
// ... // Listen for incoming connections func (es *EchoServer) serve() { for { conn, err := es.listen.Accept() // FIXME: I'd like to detect "use of closed network connection" here // FIXME: but it isn't exported from net if err != nil { log.Printf("Accept failed: %v", err) break } // ... } // ... }
Untuk menangani had ini, kami boleh menggunakan saluran es.done untuk menghantar isyarat sebelum pelayan berhenti. Begini cara kod boleh dipertingkatkan:
// ... // Listen for incoming connections func (es *EchoServer) serve() { for { conn, err := es.listen.Accept() if err != nil { select { case <-es.done: // Server is being stopped, so we can exit without logging the error. default: log.Printf("Accept failed: %v", err) } return } // ... } } // Stop the server by closing the listening socket func (es *EchoServer) stop() { es.done <- true es.listen.Close() }
Dengan menghantar nilai ke saluran es.done sebelum menutup soket mendengar, fungsi servis boleh menentukan apabila pelayan sedang dihentikan dan keluar dengan anggun tanpa log palsu kesilapan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghentikan Pelayan Go Listening dengan Anggun Tanpa Ralat Palsu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!