【问题标题】:How to gracefully shutting down a golang server? [duplicate]如何优雅地关闭 golang 服务器? [复制]
【发布时间】:2019-07-25 11:54:51
【问题描述】:

在构建自定义服务器应用程序时,最好有一个关闭机制,以确保在服务器关闭之前停止所有正在运行的进程,这也有助于更好地进行内存管理。

我们如何使用 Golang 及其强大功能构建这样的机制? Golang 中已经有一个 ,shutdown 函数,我的 ibtension 是让开发人员跳出框框思考并创建多个 做同样的方法。它将有助于使我们的 golang 社区变得更好、更强大。下面我分享一个我的回答,希望大家多提建议和回答..????

【问题讨论】:

    标签: go server channel shutdown goroutine


    【解决方案1】:

    从 Go 1.8 开始,net/http.Server 有一个函数 Shutdown 可以用来停止服务器。 Go documentation 中提供了文档和示例。

    【讨论】:

      【解决方案2】:
      package main
      
      import (
          "context"
          "log"
          "net/http"
          "os"
          "os/signal"
      )
      
      func main() {
          var srv http.Server
      
          idleConnsClosed := make(chan struct{})
          go func() {
              sigint := make(chan os.Signal, 1)
              signal.Notify(sigint, os.Interrupt)
              <-sigint
      
              // We received an interrupt signal, shut down.
              if err := srv.Shutdown(context.Background()); err != nil {
                  // Error from closing listeners, or context timeout:
                  log.Printf("HTTP server Shutdown: %v", err)
              }
              close(idleConnsClosed)
          }()
      
          if err := srv.ListenAndServe(); err != http.ErrServerClosed {
              // Error starting or closing listener:
              log.Printf("HTTP server ListenAndServe: %v", err)
          }
      
          <-idleConnsClosed
      }
      

      文档是https://golang.org/pkg/net/http/#Server.Shutdown

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-06
        • 2011-12-12
        • 2019-12-01
        • 2019-05-23
        • 2011-07-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多