同時プログラミングを行う場合、実行を続行する前にすべての goroutine が完了するまで待機する必要がある状況によく遭遇します。 Go 言語では、WaitGroup を使用することでこの目標を達成できます。 WaitGroup は、ゴルーチンのグループの完了を待つために使用できるカウント セマフォです。続行する前に、WaitGroup の Wait メソッドを呼び出して、すべてのゴルーチンがタスクを完了したことを確認する必要があります。この記事では、WaitGroupを使ってゴルーチンの実行順序を管理する正しい使い方を紹介します。
続行する前に golang スケジューラですべての goroutine を実行する必要がありますが、 runtime.gosched() では解決できません。
問題は、go ルーチンの実行速度が非常に速いため、start() の "select" が stopstream() の "select" の後に実行され、その後 "case <-chanstopstream:" レシーバーが送信の準備ができていないことです。 「case retchan このコードを実行します https://go.dev/play/p/dq85xqju2q_z 多くの場合、これら 2 つの応答が表示されます。 一時停止されていない場合に予期される応答:
リーリー
一時停止時に期待される応答ですが、一時停止時の応答はそれほど速くありません:リーリー ###コード###
2009/11/10 23:00:00 start 2009/11/10 23:00:00 receive chan 2009/11/10 23:00:03 end
回避策
現在の goroutine の実行を続行する前に、他のすべての goroutine を実行する方法はありません。stopstream
でブロックしないようにして問題を修正します:
オプション 1
chanstopstream を バッファリングされたチャネル に変更します。これにより、
stopstream はブロックせずに値を送信できるようになります。
リーリー
//m.sbmmt.com/link/56e48d306028f2a6c2ebf677f7e8f800
リーリー //m.sbmmt.com/link/a1aa0c486fb1a7ddd47003884e1fc67f
以上が続行する前にすべての goroutine を実行するように Go に依頼しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。