Go並列筆記

等待组添加、等待组等待

func Afunction(num int) {
    fmt.Println(num)
    waitgroup.Done() //タスク一個終了、タスク数-1、実際.Doneは.Add(-1) 
}

func main() {
    for i := 0; i < 10; i++ {
        waitgroup.Add(1) //goroutineごとで、タスク+1、(全体10なので、10回繰り返す)
        go Afunction(i)
    }
    waitgroup.Wait() //.Wait()ここで待つ
}

他在图书馆学习了一整天。

func main() {

    var wg sync.WaitGroup
    wg.Add(3)
    for i := 0; i < 3; i++ {
        go func(i int) {
            defer wg.Done()
            fmt.Println("reading", i)
        }(i)
    }

    fmt.Println("ready go")
    wg.Wait()
}

不正确的写法:

func main() {

    var wg sync.WaitGroup
    for i := 0; i < 3; i++ {
            wg.Add(1) //ここが違うだよ!
        go func(i int) {
            defer wg.Done()
            fmt.Println("reading", i)
        }(i)
    }

    fmt.Println("ready go")
    wg.Wait()
}
//結果:
ready go
reading 0
reading 1
reading 2

第二个例子:

func main() {

    var wg sync.WaitGroup
    wg.Add(1) 

    go func() {
        fmt.Println("wait1 enter")
        wg.Wait()
        fmt.Println("wait1 exit")
    }()

    go func() {
        fmt.Println("wait2 enter")
        wg.Wait()
        fmt.Println("wait2 exit")
    }()

    go func() {
        fmt.Println("wait3 enter")
        wg.Wait()
        fmt.Println("wait3 exit")
    }()

    go func() {
        fmt.Println("done")
        wg.Add(-1)
    }()

    wg.Wait() 
    time.Sleep(time.Second)
    fmt.Println("main exit")
}
//出力1
wait3 enter
wait2 enter
wait1 enter
done
wait1 exit
wait3 exit
wait2 exit

//出力2
done
wait1 enter
wait1 exit
wait2 enter
wait2 exit
wait3 enter
wait3 exit
main exit
广告
将在 10 秒后关闭
bannerAds