Прерывание выполнения 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