中断 Go 例程执行 (*TCPListener) Accept
在 Go 中创建 TCP 服务器时,您可能会遇到优雅的挑战关闭服务器并中断 goroutine 处理 func (*TCPListener) Accept.
在 Go 中, func (*TCPListener) Accept 会阻塞执行,直到收到连接。要中断这个goroutine,你应该:
关闭net.Listener:
中断Accept goroutine的关键是关闭从net获取的net.Listener。听(...)。通过关闭监听器,您向操作系统发出信号,表明不再接收连接,从而导致 Accept goroutine 退出。
从 Goroutine 返回:
关闭后监听者,确保你的 goroutine 返回。如果 goroutine 在 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
}
这段代码在端口 8080 上创建一个 TCPListener 并启动一个 goroutine 来处理无限循环中的传入连接。当用户按下 Enter 键时,程序将关闭监听器并中断阻塞的 Accept 调用,从而导致 goroutine 返回。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3