go常见并发模式(1):基本模式

  1. 最基本模式: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()
}
  1. 最基本模式: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)
    }
}

此时你会看到,输出又是乱序的

你可能感兴趣的:(go常见并发模式(1):基本模式)