gpt4 book ai didi

golang http 服务器在信号后正常关闭

转载 作者:IT王子 更新时间:2023-10-29 01:40:22 25 4
gpt4 key购买 nike

我正在尝试编写代码,在收到信号时优雅地关闭 http 服务器。

我的代码有两个 go 例程 - signalHandler()simpleServiceStarter() - 一个用于信号处理,另一个用于 http 服务器。收到信号后,处理程序应关闭 http 服务器所以 simpleServiceStarter()ListenAndServe() 中断。下面是我的代码。

package main

import (
"context"
"fmt"
"net/http"
"os"
"os/signal"
"syscall"
"time"
)

var (
simpleHTTPServer http.Server
sigChan chan os.Signal
simpleServiceShutdown chan bool
)

func simpleServiceStarter() {
mux := http.NewServeMux()
simpleHTTPServer := &http.Server{
Addr: ":9000",
Handler: mux,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,
}
fmt.Printf("\nstarting http server on :9000 ")
err := simpleHTTPServer.ListenAndServe()
if err != http.ErrServerClosed {
fmt.Printf("error starting simple service or closing listener - %v\n", err)
}
fmt.Printf("simple service http server shutdown completed - %v\n", err)

// communicate with main thread
simpleServiceShutdown <- true
}

func signalHandler() {
// Handle SIGINT and SIGHUP.
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGHUP)

sig := <-sigChan
fmt.Printf("\nsignalHandler() received signal: %v\n", sig)

// gracefully shutdown http server
err := simpleHTTPServer.Shutdown(context.Background())
fmt.Printf("simple service shutdown on signal %v, error: %v\n", sig, err)
close(sigChan)

}

func main() {
// block all async signals to this server. And we register only SIGINT and SIGHUP for now.
signal.Ignore()

sigChan = make(chan os.Signal, 1)
simpleServiceShutdown = make(chan bool)
go signalHandler()

go simpleServiceStarter()
<-simpleServiceShutdown // wait server to shutdown
close(simpleServiceShutdown)
}

发送信号后,服务器没有中断,还在等待。

Run the program as:
$ ./simpleHttp

starting http server on :9000
signalHandler() received signal: interrupt
simple service shutdown on signal interrupt, error: <nil>
$

From another terminal send the signal as:
tester 30202 4379 0 09:14 pts/8 00:00:00 ./simpleHttp
kill -s SIGINT 30202

我正在使用 go1.12.6 linux/amd64

最佳答案

func simpleServiceStarter() 中声明局部 simpleHTTPServer := &http.Server which shadow global

var (
simpleHTTPServer http.Server

不能在 func simpleServiceStarter() 范围之外引用此局部变量。只需在 func simpleServiceStarter()

中执行 simpleHTTPServer = &http.Server(无冒号)

关于golang http 服务器在信号后正常关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57166480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com