sync.WaitGroup ゴルーチンで chan を書き込む
phpエディタYouziがsync.WaitGroupゴルーチンにchanを記述する方法を紹介します。同時プログラミングでは、sync.WaitGroup はゴルーチンのグループの実行が完了するのを待つことができる非常に便利な同期メカニズムです。ただし、場合によっては、ゴルーチンの実行が完了した後、他のゴルーチンが使用できるように結果を chan に書き込む必要があります。この記事では、この関数をsync.WaitGroupゴルーチンに実装する方法を詳しく紹介しますので、見てみましょう。
質問内容
API エンドポイントからアイテムのリストを取得しています。次に、プロジェクトごとに別の API リクエストを作成して、個々のプロジェクトに関するデータを取得します。
API トークンにはレート制限があり、同時に多数のリクエストを行うとスロットルが発生するため、各プロジェクトに 2 番目の API リクエストを同時に行うことはできません。
ただし、最初の API 応答データは複数のページに分割できるため、複数のページのデータを同時に処理できます。
いくつかの調査の結果、次のコードはまさに私が望んでいることを実行します:
リーリーそれが機能する理由を理解したい:
リーリー 最初の試みは失敗しました。wg.Wait()
の後にチャネルを反復処理して、結果が results
チャネルに書き込まれるときにその結果を読み取ることができると考えました。結果。
func main() { // pretend paginated results from initial API request page1 := []int{1, 2, 3} page2 := []int{4, 5, 6} page3 := []int{7, 8, 9} pages := [][]int{page1, page2, page3} results := make(chan string) var wg sync.WaitGroup for i := range pages { wg.Add(1) go func(i int) { defer wg.Done() for j := range pages[i] { // simulate making additional API request and building the report time.Sleep(500 * time.Millisecond) result := fmt.Sprintf("Finished creating report for %d", pages[i][j]) results <- result } }(i) } go func() { wg.Wait() close(results) }() for result := range results { fmt.Println(result) } }
回避策
最初の試行時:
- メインのゴルーチンにより、3 つのゴルーチンが結果チャネルに値を入れます。
- メイン コルーチンは、すべてのコルーチンが完了するまで待機します。
- ゴルーチンの 1 つが結果チャネルに値を入れ、チャネルを埋めます (チャネル サイズは 1 文字列です)。
- これで、3 つのゴルーチンはすべて結果チャネルに値を入れることができなくなり、結果チャネルが解放されるまでスリープ状態になります。
- すべての goroutine はスリープ状態です。あなたは行き詰まりに陥っています。
2 回目の試行:
- メインのゴルーチンには 4 つのゴルーチンが含まれています。
- 3 ゴルーチンは結果チャネルに値を入れます。
- もう 1 つのゴルーチン (4 番目と呼びます) は、これら 3 つのゴルーチンが終了するのを待ちます。
- 同時に、メイン コルーチンは結果チャネル (for ループ) の値を待ちます
- この場合、ゴルーチンの 1 つが結果チャネルに値を入れると、残りの 3 つのゴルーチンがブロックされ、メインのゴルーチンが結果チャネルから値を取り出し、それによって他のゴルーチンのブロックが解除されます。
- つまり、3 つのゴルーチンはすべてそれぞれの値を設定して終了です
- 次に、4 番目のゴルーチンがチャネルを閉じます
- メインのゴルーチンは for ループを終了します。
以上がsync.WaitGroup ゴルーチンで chan を書き込むの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック

Go では関数とゴルーチンの間に親子関係があり、親ゴルーチンは子ゴルーチンを作成し、子ゴルーチンは親ゴルーチンの変数にアクセスできますが、その逆はできません。 go キーワードを使用して子ゴルーチンを作成すると、子ゴルーチンは匿名関数または名前付き関数を通じて実行されます。親ゴルーチンは、すべての子ゴルーチンが完了する前にプログラムが終了しないように、sync.WaitGroup を介して子ゴルーチンが完了するのを待つことができます。

関数はタスクを順番に実行するために使用され、シンプルで使いやすいですが、ブロックやリソースの制約の問題があります。 Goroutine はタスクを同時に実行する軽量のスレッドであり、高い同時実行性、スケーラビリティ、およびイベント処理機能を備えていますが、使用が複雑で高価で、デバッグが困難です。実際の戦闘では、同時タスクを実行する場合、通常、Goroutine は関数よりも優れたパフォーマンスを発揮します。

Java コレクション フレームワークは、スレッドセーフなコレクションと同時実行制御メカニズムを通じて同時実行を管理します。スレッドセーフなコレクション (CopyOnWriteArrayList など) はデータの一貫性を保証しますが、非スレッドセーフなコレクション (ArrayList など) は外部同期を必要とします。 Java は、ロック、アトミック操作、ConcurrentHashMap、CopyOnWriteArrayList などのメカニズムを提供して同時実行性を制御し、それによってマルチスレッド環境でのデータの整合性と一貫性を確保します。

マルチスレッド環境では、PHP 関数の動作はそのタイプによって異なります。 通常の関数: スレッドセーフで、同時に実行できます。グローバル変数を変更する関数: 安全ではないため、同期メカニズムを使用する必要があります。ファイル操作機能: 安全ではないため、アクセスを調整するには同期メカニズムを使用する必要があります。データベース操作機能: 安全ではないため、競合を防ぐためにデータベース システムのメカニズムを使用する必要があります。

C++ でのスレッド間通信の方法には、共有メモリ、同期メカニズム (ミューテックス ロック、条件変数)、パイプ、メッセージ キューなどがあります。たとえば、ミューテックス ロックを使用して共有カウンタを保護します。ミューテックス ロック (m) と共有変数 (counter) を宣言し、各スレッドがロック (lock_guard) によってカウンタを更新するようにします。競合状態を防ぐため。

C++ 同時プログラミング フレームワークには、次のオプションがあります。 軽量スレッド (std::thread)、共有メモリ マルチプロセッサ用の Boost 同時実行コンテナーおよびアルゴリズム、高性能のクロスプラットフォーム C++ 同時実行操作ライブラリ。 (cpp-Concur)。

最近のプライマリー市場で最も注目されているトラックは間違いなく AI で、次に毎日議論されるプロジェクトの 80% がこの 2 つのトラックに集中しています。来年、AI バブルがピークに達することが予測されており、何百もの新しい AI プロジェクトが稼働し、バブルがついに崩壊すると、AI トラックの市場価値はピークに達します。 AIXCrypto の適合点を見つけたユニコーンが、この道と業界全体を前進させ続けるでしょう。したがって、現在の AI の過熱環境では、ここ数か月でインフラ レベル、特にパブリック チェーンのインフラ トラックで起こった変化を冷静に検討する必要があります。いくつかの新しいことは言及する価値があります。 1.ET

プログラムのパフォーマンスの最適化方法には、次のようなものがあります。 アルゴリズムの最適化: 時間の複雑さが低いアルゴリズムを選択し、ループと条件文を減らします。データ構造の選択: ルックアップ ツリーやハッシュ テーブルなどのデータ アクセス パターンに基づいて、適切なデータ構造を選択します。メモリの最適化: 不要なオブジェクトの作成を回避し、使用されなくなったメモリを解放し、メモリ プール テクノロジを使用します。スレッドの最適化: 並列化できるタスクを特定し、スレッド同期メカニズムを最適化します。データベースの最適化: インデックスを作成してデータの取得を高速化し、クエリ ステートメントを最適化し、キャッシュまたは NoSQL データベースを使用してパフォーマンスを向上させます。
