Golang 中 goroutine 中的运行是无序的,如果要让多个 goroutine 顺序执行,例如每个 goroutine 在并行执行时顺序打印 0-9,这里记录一种通过 atomic
包的原子操作来实现的方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| package main
import ( "fmt" "sync/atomic" "time" )
func ParallelPrintOrderdNum() { var count uint32
trigger := func(i uint32, fn func()) { for { if n := atomic.LoadUint32(&count); n == i { fn() atomic.AddUint32(&count, 1) break } time.Sleep(time.Nanosecond) } }
for i := uint32(0); i < 10; i++ { go func(i uint32) { fn := func() { fmt.Println(i) } trigger(i, fn) }(i) }
trigger(10, func() {}) }
func main() { ParallelPrintOrderdNum() }
|