go 多协程怎么同步

本文阅读 1 分钟
首页 golang 正文
通过sync同步

通过 sync.WaitGroup 实现,WaitGroup对象内部有一个计数器,最初从0开始, WaitGroup 有三个方法
Add(): 计数器增加N
Done(): 完成一个任务,计数器减少1
Wait(): 同步阻塞,计数器为0之后才继续向下执行

var wg sync.WaitGroup
// 完成1-10对公共切片进行赋值并将其值进行平方
var wg sync.WaitGroup
data := make([]int, 10)
for i := 0; i < 10; i++ {
    wg.Add(1)
    go func(idx int, w *sync.WaitGroup) {
        data[idx] = idx
        w.Done()
    }(i, &wg)
}
wg.Wait()
fmt.Println(data)
for j := 0; j < 10; j++ {
    wg.Add(1)
    go func(idx int, w *sync.WaitGroup) {
        data[idx] = int(math.Pow(float64(data[idx]), 2))
        w.Done()
    }(j, &wg)
}
wg.Wait()
fmt.Println(data)

通过channel同步
例子同上sync例子

ch := make(chan bool, 10)
data := make([]int, 10)
for i := 0; i < 10; i++ {
    go func(idx int) {
        defer func() {
            if err := recover(); err != nil {
                ch <- false
            }
        }()
        data[idx] = idx
        ch <- true
    }(i)
}
fmt.Println(data)
for i := 0; i < 10; i++ {
    go func(idx int) {
        defer func() {
            if err := recover(); err != nil {
                ch <- false
            }
        }()
        data[idx] = int(math.Pow(float64(data[idx]), 2))
        ch <- true
    }(i)
}
for j := 0; j < 10; j++ {
    fmt.Print(<-ch, " ")
}

参考资料

https://itopic.org/goroutine.html

本文来自投稿,不代表本站立场,如若转载,请注明出处:
了解中间件吗?有什么好处?
« 上一篇 09-17
Go 高并发的特点
下一篇 » 09-17

发表评论

发表评论