Golang服务器关闭时使用Context是否多此一举?
s.Shutdown()传入带超时Context的疑问解答 Context在这里的核心作用:控制优雅关闭的超时时间
这里的Context不是用来传递数据的,而是给Shutdown()设定一个「硬截止时间」。Shutdown()本身是优雅关闭逻辑:它会停止接收新请求,同时等待当前正在处理的请求完成后再退出。但如果遇到卡住的请求(比如客户端长时间不响应、业务逻辑死循环),总不能让服务器一直等下去吧?带超时的Context就是用来解决这个问题——到了超时时间,不管还有没有未完成的请求,Shutdown()都会强制终止进程,避免服务挂着无法退出。能不能直接用
context.Background()?
绝对不建议。context.Background()是无超时、无取消信号的空上下文,传给Shutdown()的话,Shutdown()会一直阻塞,直到所有请求都处理完毕。如果有请求一直卡住,你的进程就会永远停在这一步,无法正常退出,这在生产环境是致命的。s.Shutdown()本身能完成关闭吗?
单说Shutdown()的功能,它确实能完成优雅关闭,但前提是它能收到「终止信号」。这个终止信号要么来自Context的超时/取消,要么来自外部的取消调用。如果只传context.Background(),相当于没有终止信号,Shutdown()就会无限等待,等于没有真正完成关闭流程。
举个实际场景:假设你设置了5秒超时的Context,当收到中断信号后,服务器会给正在处理的请求5秒时间收尾,5秒一到就强制关闭;如果用context.Background(),要是有个请求卡了10分钟,你的服务器就得卡10分钟才能退出。
内容的提问来源于stack exchange,提问作者wubbalubba

