golang を開発および使用していると、通常、シャットダウンまたは実行の停止が必要な状況に遭遇します。たとえば、プログラムが終了するか例外が発生した場合は、正常にシャットダウンする必要があります。
正常なシャットダウンはプログラムを停止すると同時に、開始されたタスクの処理を許可し、データ損失やリソース漏洩などの問題を回避し、クライアントに不必要な損失を与えません。この記事では、golang の正常なシャットダウン方法について説明します。
golang では、セマフォやチャネルを設定することで正常なシャットダウンを実装することができます。具体的な実装方法は次のとおりです。 ## セマフォを介して実装
package main import ( "log" "os" "os/signal" "syscall" "time" ) func main() { stop := make(chan os.Signal, 1) signal.Notify(stop, syscall.SIGINT, syscall.SIGTERM) log.Println("Starting...") go func() { <-stop log.Println("Stopping...") // 处理关闭逻辑 time.Sleep(3 * time.Second) log.Println("Graceful shutdown finished") os.Exit(0) }() // 处理业务逻辑 for { log.Println("Running...") time.Sleep(1 * time.Second) } }
次に、Goroutine を開始し、停止チャネルをリッスンします。SIGINT または SIGTERM シグナルが受信されると、Goroutine の実行がトリガーされます。実行プロセス中にシャットダウン ロジックを処理します。ここで Time.Sleep を使用して、時間のかかる操作をシミュレートし、プログラムが正常に終了するかどうかをより適切にテストします。最後に、os.Exit 関数を通じて、プログラムのシャットダウン要求が処理されたことがオペレーティング システムに通知されます。
メインの goroutine では、ビジネス ロジックを処理し、毎秒 "Running..." を出力します。これは単なる例です。通常、ビジネス ロジックを処理するときは、定期的に保存する必要があります。データやリリースリソースなど。
スルーチャネル
package main import ( "log" "os" "time" ) func main() { done := make(chan bool) log.Println("Starting...") go func() { osSignals := make(chan os.Signal, 1) signal.Notify(osSignals, syscall.SIGINT, syscall.SIGTERM) select { case <-osSignals: log.Println("Stopping...") // 处理关闭逻辑 time.Sleep(3 * time.Second) log.Println("Graceful shutdown finished") done <- true } }() // 处理业务逻辑 for { log.Println("Running...") time.Sleep(1 * time.Second) select { case <-done: return // 正常退出 default: continue } } }
別のゴルーチンでは、make を通じて os.Signal 型、長さ 1 のシグナル バッファー チャネルを作成し、シグナル パッケージの Notify 関数を通じて、どのようなシグナルを監視するかをオペレーティング システムに伝えます。そしてSIGTERM。次に、select 関数を使用して osSignals をリッスンし、SIGINT または SIGTERM シグナルを受信すると、特定の操作がトリガーされます。
プログラムによって監視される信号
信号の説明 | |
---|---|
SIGTERM ## を通じて発行されます。 | |
#SIGHUP | 一時停止信号。通常、端末接続が中断されたことを示します。構成ファイルなどを再読み込みする必要があります。 |
##SIGUSR1-31 | カスタムシグナル |
Kill 停止したプロセス シグナルをキャッチまたは無視できません。プロセスは暴力的に強制終了することのみ可能です。 | |
プロセス停止シグナルをキャッチまたは無視できません。プロセスは強制的に停止することしかできません。 | |
プロセスの実行を継続します | |
パイプ破断信号。通常はデータの読み取りを示します。相手側が接続を閉じました。 | |
アラーム クロック信号。定期的に操作をトリガーするために使用されます。 | |
サブプロセス終了シグナル | |
正常なシャットダウンの役割 | 正常なシャットダウンにより、リクエストや操作の失敗によって引き起こされるデータ損失、リソース漏洩、その他の問題を回避できます。サービスを提供する長時間実行されるプログラムやアプリケーションの場合、特に重要です。特に分散システムやマイクロサービス アーキテクチャでは、正常なシャットダウンはシステムの安定性とパフォーマンスを効果的に確保できますが、対象となる問題処理機能がないと、プログラムが勝手に終了したり、停止信号を受信した後にクラッシュを引き起こしたりして、深刻な問題を引き起こす可能性があります。クライアントに不必要な損失を与えます。 |
この記事を通じて、正常なシャットダウンに golang のチャネルと os/signal パッケージを使用する方法、およびシグナルをリッスンして正常なシャットダウンを完了する方法を学びました。実際の開発において、アプリケーションを正常にシャットダウンすることは非常に重要な作業であり、正常なシャットダウンはプログラムの安定性を効果的に向上させ、リソースの無駄やデータの損失などの問題を回避します。
以上がgolang のエレガントなシャットダウン方法について話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。