Go 中管理状态的主要机制是通过通道进行通信。例如,我们在 worker 池中就看到了这一点。不过,还有一些其他选项来管理状态。在这里,我们将介绍如何使用 sync/atomic 包来管理多个 goroutines 访问的原子计数器。
package main
import (
"fmt"
"sync"
"sync/atomic"
)
func main() {
// 我们将使用原子整数类型来表示我们的(始终为正的)计数器。
var ops atomic.Uint64
// WaitGroup 将帮助我们等待所有 goroutines 完成它们的工作。
var wg sync.WaitGroup
// 我们将启动 50 个 goroutines,每个 goroutine 都会将计数器递增 1000 次。
for i := 0; i < 50; i++ {
wg.Add(1)
go func() {
for c := 0; c < 1000; c++ {
// 为了原子性地递增计数器,我们使用 Add。
ops.Add(1)
}
wg.Done()
}()
}
// 等待所有 goroutines 完成。
wg.Wait()
fmt.Println("ops:", ops.Load())
}在这里,没有 goroutines 在写入 ops,但通过使用 Load,即使其他 goroutines 正在(原子地)更新它,读取值也是安全的。
$ go run atomic-counters.go
ops: 50000原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。