我需要在Golang中实现一个服务器。我正在将软件包用于此目的,但我不了解如何优雅地脱离循环。netaccept因此,请看一下包中的示例:netln, err := net.Listen("tcp", ":8080")if err != nil { // handle error}for { conn, err := ln.Accept() if err != nil { // handle error } go handleConnection(conn)}我想做更多的事情,for { select { case <-done: break case conn, err := <-ln.Accept(): if err != nil { break } ...}换句话说,我希望能够以某种方式优雅地终止程序。
1 回答
森林海
TA贡献2011条经验 获得超2个赞
对于任何服务,确保干净关闭的最佳做法是确保服务的每个部分都支持取消。添加上下文。上下文支持是实现此目的的推荐方法。
因此,首先,请确保您不会挂起恶意客户端连接。所以要添加支持:net.Listenercontext.Context
var lc net.ListenConfig
ln, err := lc.Listen(ctx, "tcp", ":8080")
取消将中断此处的任何恶意客户端连接,这些连接可能在握手期间被阻止。ctx
编辑:为了确保我们可以在呼叫被阻止等待时中断呼叫,可以利用相同的状态,并在检测到取消事件时关闭连接(如上一个现已删除的应答中所述):Listen()ctx
go func() {
<-ctx.Done()
log.Println("shutting service down...")
ln.Close()
}()
工作示例:https://play.golang.org/p/LO1XS4jBQ02
- 1 回答
- 0 关注
- 195 浏览
添加回答
举报
0/150
提交
取消