如何解决Go:异步启动 HTTP 服务器,但如果启动失败则返回错误
我想在 goroutine 中启动一个 HTTP 服务器,但如果启动失败,它的父级会返回一个错误。有没有这样做的好方法?我尝试在通道中传递错误。但是,即使服务器成功启动,这也会使父阻塞(除非我在该通道上引入了任意超时时间)。
func Start() error {
go func() {
srv = &http.Server{...}
if err := srv.ListenAndServe(); err != http.ErrServerClosed {
// return err from Start()
}
}
// return nil if server started successfully
}
解决方法
ListenAndServe 是一个辅助函数,它打开一个侦听套接字,然后在该套接字上提供连接服务。
ListenAndServer 中的启动错误在函数的监听部分。在主 goroutine 上创建侦听器并在那里处理错误。在 goroutine 中运行服务器:
l,err := net.Listen("tcp",":8080") // adjust arguments as needed.
if err != nil {
// Handle error.
}
srv = &http.Server{...}
go func() {
if err := srv.Serve(l); err != nil {
// Handle non-startup errors here.
}()
,
如果您想坚持该模式,请通过通道发送 nil
错误以表示初始化成功或关闭通道。这两个动作都可以被主线程拾取,并且不会被阻塞。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。