Golang は、効率的な同時処理機能と優れたパフォーマンスを備えた非常に人気のあるプログラミング言語です。多くの golang 開発者はこのような問題に遭遇すると思います。golang で http サービスを正常にシャットダウンするにはどうすればよいですか?
まず、http サービスの作成は比較的簡単で、必要なコードは数行だけであることを知っておく必要があります。たとえば、次は簡単な例です。
package main import ( "fmt" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello") }) http.ListenAndServe(":8080", nil) }
ここでは、新しい http サービスを作成し、ローカル ポート 8080 をリッスンし、アクセスごとに「Hello」を返します。しかし、このサービスを正常にシャットダウンするにはどうすればよいでしょうか?
一般的な方法は、os.Signal を使用してサービスのライフサイクルを管理することです。 os.Signal は、プログラムに実行の終了を要求する目的で、オペレーティング システムによって Ctrl C などのプロセスに送信される割り込み信号です。 golang では、これらのシグナルをリッスンし、シグナルを受信した後にいくつかのフック関数を実行して http サービスを正常にシャットダウンできます。
具体的な実装は次のとおりです:
package main import ( "context" "fmt" "net/http" "os" "os/signal" "syscall" "time" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello") }) srv := &http.Server{Addr: ":8080"} signalChan := make(chan os.Signal, 1) signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM) go func() { sig := <-signalChan fmt.Printf("Signal Received: %s, Gracefully shutting down...\n", sig) ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() srv.Shutdown(ctx) }() fmt.Println("Server starting...") if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { fmt.Printf("server start failed, err: %v\n", err) return } fmt.Println("Server closed.") }
signal.Notify メソッドを通じて 2 つのシグナル、つまり Ctrl C と kill を登録しました。その後、main関数の無限ループでシグナルの到着を待ちます。シグナルが到着すると、まずシグナルを正常に受信したことを示すログの行を出力し、次に http.Server の Shutdown() メソッドを呼び出して http サービスを通常どおりシャットダウンします。コンテキスト。
context.Context オブジェクトを http.Server の Shutdown() メソッドに渡すと、http サービスは正常なシャットダウンのプロセスに入ります。Shutdown() メソッドの具体的なプロセスは次のとおりです。
以上がgolang で http サービスを正常にシャットダウンする方法を分析するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。