ホームページ > バックエンド開発 > Golang > 私の Go Main Goroutine は永久にスリープするべきですか、それとも正常に終了すべきですか?

私の Go Main Goroutine は永久にスリープするべきですか、それとも正常に終了すべきですか?

DDD
リリース: 2024-12-18 14:16:15
オリジナル
539 人が閲覧しました

Should My Go Main Goroutine Sleep Forever or Gracefully Quit?

メインゴルーチンのジレンマ: スリープか終了か?

開発者は、永遠の炎に似た Go プロジェクトを常に実行し続ける必要性に遭遇することがよくあります。決して消えません。逆に、プログラムの実行を正常に終了したい場合もあります。この記事では、これらのシナリオで使用できるオプションについて説明します。

メインのゴルーチンを「スリープ」する

メインのゴルーチンを休止状態にするには、その実行を効果的にブロックするいくつかの構造が存在します。 CPUリソースを消費します。次の例を考えてみましょう:

  • 大文字と小文字を区別しない選択:

    select{}
    ログイン後にコピー
  • 空からの受信チャンネル:

    <-make(chan int)
    ログイン後にコピー
  • Nil チャンネルからの受信:

    <-(chan int)(nil)
    ログイン後にコピー
  • ニルへの送信チャンネル:

    (chan int)(nil) <- 0
    ログイン後にコピー
  • ロックされたミューテックスのロック:

    mu := sync.Mutex{}
    mu.Lock()
    mu.Lock()
    ログイン後にコピー

誘導終わり: 辞めるGoroutine

終了手段を提供することが目的の場合、終了チャネルを導入することは実行可能なアプローチです。メインの goroutine 内で、コードはこのチャネルからの信号を無限に待つことができます。機が熟したら、終了チャネルを閉じることができます:

var quit = make(chan struct{})

func main() {
    // Startup code...

    // Block until the quit signal arrives:
    <-quit
}

// In a separate goroutine, when termination is requested:
close(quit)
ログイン後にコピー

注: Go プログラムの実行仕様に従って、終了チャネルを閉じるとプログラムの即時終了がトリガーされる可能性があります。

ノンブロッキングスリープ

場合メインのゴルーチンをブロックすることが望ましくない場合、代替手段として、長時間の time.Sleep() を使用します。最大許容期間は約 292 年です:

time.Sleep(time.Duration(1<<63 - 1))
ログイン後にコピー

この期間を超える予定のプログラムの場合、無限ループを実装できます:

for {
    time.Sleep(time.Duration(1<<63 - 1))
}
ログイン後にコピー

以上が私の Go Main Goroutine は永久にスリープするべきですか、それとも正常に終了すべきですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート