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
Susan Sarandonasal
2024-12-12 11:28:09337semak imbas

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))
  }
}
  • 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
}

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!

Kenyataan:
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