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)
    }
}

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容