- 最基本模式:go+sync
如下使用go+sync.WaitGroup并发执行让0-9每位数字加一
var wg sync.WaitGroup
func main() {
for i := 0; i < 10; i++ {
wg.Add(1)
go func(index int) {
defer wg.Done()
fmt.Println(index + 1)
}(i)
}
wg.Wait()
}
- 最基本模式:go+channel
go社区有句经典的话叫做“不要通过共享内存来通信,要通过通信来共享内存”,所以我们把上面的函数改成管道的方式
func main() {
c := make(chan int, 10)
for i := 0; i < 10; i++ {
go func(index int) {
c <- index + 1
}(i)
}
go close(c)
for item := range c {
fmt.Println(item)
}
}
但这时候你可能会发现一个问题,方式1的打印结果每次都是乱序的,但方式2每次打印结果都是顺序的。这时候始终都要记住协程不能保证顺序
。如果是顺序出来的, 可能是执行太快了,或者过程太简单,go也就调了一个 协程来执行。我们将方式2加一点时延再来看看结果
func main() {
c := make(chan int, 10)
for i := 0; i < 10; i++ {
go func(index int) {
time.Sleep(time.Millisecond * 500)
c <- index + 1
}(i)
}
go func() {
time.Sleep(time.Second * 2)
close(c)
}()
for item := range c {
fmt.Println(item)
}
}
此时你会看到,输出又是乱序的