ホームページ  >  記事  >  バックエンド開発  >  続行する前にすべての goroutine を実行するように Go に依頼します

続行する前にすべての goroutine を実行するように Go に依頼します

PHPz
PHPz転載
2024-02-11 17:20:17872ブラウズ

在继续之前要求 Go 运行所有 goroutine

同時プログラミングを行う場合、実行を続行する前にすべての 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 はブロックせずに値を送信できるようになります。 リーリー https://www.php.cn/link/56e48d306028f2a6c2ebf677f7e8f800

オプション 2

: 値を送信する代わりにチャネルを閉じます。送信者はいつでもチャネルを閉じることができます。閉じたチャネルでゼロ値を受け取り、チャネル値のタイプを返します。

リーリー https://www.php.cn/link/a1aa0c486fb1a7ddd47003884e1fc67f

以上が続行する前にすべての goroutine を実行するように Go に依頼しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。