ホームページ > バックエンド開発 > Golang > sync.WaitGroup を使用してすべてのゴルーチンを実行するにはどうすればよいですか?

sync.WaitGroup を使用してすべてのゴルーチンを実行するにはどうすればよいですか?

PHPz
リリース: 2024-02-09 11:40:09
転載
772 人が閲覧しました

sync.WaitGroup を使用してすべてのゴルーチンを実行するにはどうすればよいですか?

php エディター Apple は、すべてのゴルーチンを実行する実用的な方法である sync.WaitGroup を紹介しています。 Go 言語では、ゴルーチンは複数のタスクを同時に実行できる軽量のスレッドです。ただし、次のステップに進む前に、すべてのゴルーチンが完了するまで待つ必要がある場合があります。このとき、sync.WaitGroup が役に立ちます。これは、すべてのゴルーチンが完了するのを待つためのシンプルかつ効果的な方法を提供し、プログラムの正しい実行順序を保証します。次に、sync.WaitGroupを使ってこの機能を実装する方法を詳しく紹介します。

質問内容

現在、すべての値をチャネルにプッシュし、そこから読み取って二乗計算しています。 time.sleep(2000 * time.millisecond) は実行を 2 秒間ブロックするため、使用を避けたいと考えています。代わりに、各 goroutine が処理され、その実行を待機してからプログラムを終了したいと考えています。私は golang から離れたばかりなので、この基本的な質問をしています:(。誰かこの問題の解決を手伝ってくれませんか?

package main

import (
    "fmt"
    "sync"
    "time"
)

func doSquare(num int) int {
    return num * num
}

var wg sync.WaitGroup

func main() {

    wg.Add(1)
    st := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    quit := make(chan bool)
    ch := make(chan int)
    go func() {
        for i := range st {
            ch <- i
        }
    }()

    go func() {
        for {
            select {
            case x := <-ch:
                fmt.Println(doSquare(x))
                // return

            case <-quit:
                wg.Done()
            default:
                // fmt.Println("---")
                // do something
            }
        }
    }()

    quit <- true

    wg.Wait()
    time.Sleep(2000 * time.Millisecond)
}
ログイン後にコピー

解決策

qui t を最初のゴルーチンの最後に移動するだけです

リーリー

これは close(ch) これ以上データがないことを表す別の言い方

リーリー

以上がsync.WaitGroup を使用してすべてのゴルーチンを実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート