Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Menghentikan Pelayan Go dengan Anggun dan Mengelakkan Ralat 'Penggunaan Sambungan Rangkaian Tertutup'?

Bagaimanakah Saya Boleh Menghentikan Pelayan Go dengan Anggun dan Mengelakkan Ralat 'Penggunaan Sambungan Rangkaian Tertutup'?

Susan Sarandon
Lepaskan: 2024-12-12 11:28:09
asal
334 orang telah melayarinya

How Can I Gracefully Stop a Go Server and Avoid

Mengendalikan Pemberhentian Pelayan Dengan Anggun dalam Go

Pengenalan Masalah

Dalam Go, menghentikan pelayan mendengar dengan berhati-hati adalah penting untuk mengelakkan penamatan mendadak dan kemungkinan kehilangan data . Satu cabaran ialah melihat ralat khusus yang menunjukkan pendengar telah ditutup, kerana ia tidak dieksport secara eksplisit dalam pustaka standard.

Pendekatan Penyelesaian

Untuk menangani isu ini, kami boleh memanfaatkan saluran yang telah dilakukan untuk memberi isyarat bahawa pelayan akan ditutup.

Logik Pelayan yang Diperbaiki

fungsi serve() yang diubah suai kini mengendalikan ralat secara berbeza:

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))
  }
}
Salin selepas log masuk
  • Saluran yang dilakukan membolehkan kami menghantar isyarat kepada fungsi serve() sebelum menutup pendengar.
  • Apabila berhenti () dipanggil, ia menghantar nilai untuk dilakukan, yang menyahsekat pernyataan pilih dalam serve().
  • Ini memastikan bahawa apabila pendengar ditutup, fungsi serve() keluar dengan anggun tanpa melaporkan ralat "penggunaan sambungan rangkaian tertutup".

Kaedah Berhenti Kemas Kini

Kaedah stop() yang diubah suai kini menghantar isyarat kepada saluran yang telah selesai sebelum menutup pendengar:

// Stop the server by closing the listening listen
func (es *EchoServer) stop() {
  es.done <- true   // We can advance past this because we gave it a buffer of 1
  es.listen.Close() // Now the Accept will have an error above
}
Salin selepas log masuk

Penilaian dan Kesimpulan

Pendekatan ini menawarkan penambahbaikan dan cara yang anggun untuk mengendalikan pemberhentian pelayan dalam Go. Dengan menggunakan saluran yang telah selesai, kami boleh menghalang paparan mesej ralat yang tidak diingini sambil mengekalkan kawalan ke atas penamatan pelayan.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghentikan Pelayan Go dengan Anggun dan Mengelakkan Ralat 'Penggunaan Sambungan Rangkaian Tertutup'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan