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

标签 go server channel shutdown goroutine

<分区>

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

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

最佳答案

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 .

关于go - 如何优雅地关闭 golang 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54978683/

相关文章:

swift - AudioUnit - 在 Swift 中控制左声道和右声道输出

mongodb更新添加每个映射结构的值

class - 结构中的私有(private)类

amazon-web-services - 使用 AWS Go SDK 将消息发布到 SNS

server - couchbase 服务器中的集群/桶是什么

Java nextLine 在套接字上被阻塞

go - 在监听 channel 和 for 循环处理时重写 channel

go - 如何安装特定版本的 golint 以供全局使用?

c - C 中的多线程服务器(线程丢失)

java - 使用 SSLContext 创建 SocketChannel