«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как корректно завершить работу TCP-сервера Go и прервать горутину `(*TCPListener) Accept`?

Как корректно завершить работу TCP-сервера Go и прервать горутину `(*TCPListener) Accept`?

Опубликовано 12 ноября 2024 г.
Просматривать:419

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

Прерывание выполнения Go-подпрограммы (*TCPListener) Accept

При создании TCP-сервера в Go вы можете столкнуться с проблемой корректного выключение сервера и прерывание обработки горутины func (*TCPListener) Accept.

В Go func (*TCPListener) Accept блокирует выполнение до тех пор, пока не будет получено соединение. Чтобы прервать эту горутину, вы должны:

Закрыть net.Listener:

Ключом к прерыванию горутины Accept является закрытие net.Listener, полученного из net. Слушать(...). Закрывая прослушиватель, вы сигнализируете операционной системе, что больше соединений получено не будет, что приводит к завершению работы горутины Accept.

Возврат из горутины:

После закрытия слушатель, убедитесь, что ваша горутина возвращается. Если горутина имеет код, следующий за вызовом Accept, она продолжит выполнение и может вызвать непредвиденное поведение или ошибки.

Пример кода:

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
}

Этот код создает TCPListener на порту 8080 и запускает горутину, которая обрабатывает входящие соединения в бесконечном цикле. Когда пользователь нажимает Enter, программа закрывает прослушиватель и прерывает блокирующий вызов Accept, вызывая возврат горутины.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3