如何优雅地关闭 golang 服务器?

ASH*_*EEV 1 shutdown channel go goroutine server

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

我们如何利用 Golang 及其力量来构建这样的机制?Golang 中已经有一个 ,shutdown函数可用,我的目的是让开发人员跳出框框思考并创建多种方法来执行相同的操作。这将有助于让我们的golang社区变得更好、更强。下面我分享一下我的一个答案,希望大家多提建议和解答。

sh.*_*seo 5

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
}
Run Code Online (Sandbox Code Playgroud)

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