首页 > 后端开发 > Golang > 如何优雅地停止 Go 监听服务器而不出现虚假错误?

如何优雅地停止 Go 监听服务器而不出现虚假错误?

Linda Hamilton
发布: 2024-12-12 18:59:10
原创
842 人浏览过

How Can I Gracefully Stop a Go Listening Server Without Spurious Errors?

在 Go 中优雅地停止监听服务器

背景

Go 的 net 包提供了创建监听服务器的能力。然而,由于listen.Accept方法的阻塞性质,优雅地停止这些服务器可能具有挑战性。

现有方法

停止服务器的一种常见方法是关闭侦听套接字。但是,这可能会导致在连接接受期间无法将错误与真正的错误区分开来。因此,以下代码片段显示了此问题:

// ...

// Listen for incoming connections
func (es *EchoServer) serve() {
  for {
    conn, err := es.listen.Accept()
    // FIXME: I'd like to detect "use of closed network connection" here
    // FIXME: but it isn't exported from net
    if err != nil {
      log.Printf("Accept failed: %v", err)
      break
    }
    // ...
  }
  // ...
}
登录后复制

增强方法

为了解决此限制,我们可以利用 es.done 通道在服务器启动之前发送信号停了下来。以下是代码的改进方法:

// ...

// Listen for incoming connections
func (es *EchoServer) serve() {
  for {
    conn, err := es.listen.Accept()
    if err != nil {
      select {
      case <-es.done:
        // Server is being stopped, so we can exit without logging the error.
      default:
        log.Printf("Accept failed: %v", err)
      }
      return
    }
    // ...
  }
}

// Stop the server by closing the listening socket
func (es *EchoServer) stop() {
  es.done <- true
  es.listen.Close()
}
登录后复制

通过在关闭监听套接字之前向 es.done 通道发送一个值,serve 函数可以确定服务器何时停止并正常退出,而不会记录虚假信息错误。

以上是如何优雅地停止 Go 监听服务器而不出现虚假错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板