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

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

PHPz
PHPz転載
2024-02-09 11:40:09724ブラウズ

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 までご連絡ください。