メインゴルーチンのジレンマ: スリープか終了か?
開発者は、永遠の炎に似た 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 サイトの他の関連記事を参照してください。