Go:异步启动 HTTP 服务器,但如果启动失败则出现 return 错误
Go: start HTTP server asynchronously but return error if startup failed
我想在 goroutine 中启动一个 HTTP 服务器,但如果启动失败,它的父 return 就会出错。有这样做的好方法吗?我尝试在通道中传递错误。但是,即使服务器成功启动,这也会使父级阻塞(除非我引入任意超时来监听该通道)。
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
错误以表示初始化成功或关闭通道。这两个动作都可以被主线程拾取并且它会停止被阻塞。
我想在 goroutine 中启动一个 HTTP 服务器,但如果启动失败,它的父 return 就会出错。有这样做的好方法吗?我尝试在通道中传递错误。但是,即使服务器成功启动,这也会使父级阻塞(除非我引入任意超时来监听该通道)。
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
错误以表示初始化成功或关闭通道。这两个动作都可以被主线程拾取并且它会停止被阻塞。