"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo cerrar correctamente un servidor Go TCP e interrumpir la rutina `(*TCPListener) Accept`?

¿Cómo cerrar correctamente un servidor Go TCP e interrumpir la rutina `(*TCPListener) Accept`?

Publicado el 2024-11-12
Navegar:262

How to Gracefully Shut Down a Go TCP Server and Interrupt the `(*TCPListener) Accept` Goroutine?

Interrumpir una rutina de Go en ejecución (*TCPListener) Aceptar

Al crear un servidor TCP en Go, puede encontrar el desafío de hacerlo con gracia cerrar el servidor e interrumpir la función de manejo de rutinas (*TCPListener) Aceptar.

En Go, la función (*TCPListener) Aceptar bloquea la ejecución hasta que se reciba una conexión. Para interrumpir esta rutina, debes:

Cerrar la red.Oyente:

La clave para interrumpir la rutina Aceptar es cerrar la red.El oyente se obtiene de la red. Escuchar(...). Al cerrar el oyente, le indica al sistema operativo que no se recibirán más conexiones, lo que provocará que se cierre la rutina Aceptar.

Regreso de la rutina Gor:

Después de cerrar el oyente, asegúrese de que su rutina regrese. Si la rutina tiene código después de la llamada Aceptar, continuará ejecutándose y puede provocar errores o comportamientos no deseados.

Código de ejemplo:

package main

import (
    "fmt"
    "net"
)

func main() {
    ln, err := net.Listen("tcp", ":8080")
    if err != nil {
        // Handle error
    }

    go func() {
        for {
            conn, err := ln.Accept()
            if err != nil {
                if err == net.ErrClosed {
                    return // Listener was closed
                }
                // Handle other errors
            }
            // Handle connection
            conn.Close()
        }
    }()

    fmt.Println("Press enter to stop...")
    var input string
    fmt.Scanln(&input)

    ln.Close() // Close the listener, interrupting the Accept loop
}

Este código crea un TCPListener en el puerto 8080 e inicia una rutina que maneja las conexiones entrantes en un bucle infinito. Cuando el usuario presiona Enter, el programa cierra el oyente e interrumpe el bloqueo Aceptar llamada, lo que hace que la rutina regrese.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3