ブロックせずに Go ルーチンに停止するように通知する方法は?

Patricia Arquette
リリース: 2024-10-28 05:00:30
オリジナル
126 人が閲覧しました

How to Signal a Go Routine to Halt without Blocking?

Go ルーチンに停止の通知

このシナリオでは、Go ルーチンに操作を停止するよう指示する必要があります。主な課題は、ブロッキング動作を導入せずにこのシグナリングを実現することにあります。

提案されたソリューションには、セカンダリ チャネルの採用が含まれます。ただし、従来のチャネルの使用法では、go ルーチンがデータをアクティブに処理しているときにこのチャネルからシグナルを受信しようとすると、ブロックが発生します。

Select Case の使用

ブロックを回避するには、コードで以下を利用できます。デフォルト句を含む選択ケース。これにより、go ルーチンはセカンダリ チャネルからシグナルを受信するまでデータの処理を続行できます:

<code class="go">go func() {
    for {
        fmt.Println("working")
        time.Sleep(1 * time.Second)
        select {
        case <-tooLate:
            fmt.Println("stopped")
            return
        case proCh <- "processed": //this why it won't block the goroutine if the timer expirerd.
        default: // adding default will make it not block
        }
        fmt.Println("done here")
    }
}()</code>
ログイン後にコピー

default 句を利用することで、go ルーチンはタイマーが期限切れになった場合でもブロックを回避できます。

sync.Cond の使用

もう 1 つのアプローチには、チャネルの代わりに sync.Cond を利用する方法があります。条件変数は、ゴルーチン間で待機してシグナルを送る方法を提供します。

結論

default 句または sync.Cond を備えたセカンダリ チャネルを使用すると、go ルーチンに停止するよう効果的にシグナルを送ることができます。ブロック動作に頼らずに実行します。

以上がブロックせずに Go ルーチンに停止するように通知する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!