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

PHPz
リリース: 2024-02-11 17:20:17
転載
899 人が閲覧しました

在继续之前要求 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 までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!