美文网首页
go常见并发模式(1):基本模式

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

作者: 快感炮神 | 来源:发表于2020-09-19 14:00 被阅读0次
    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):基本模式

          本文链接:https://www.haomeiwen.com/subject/eppeyktx.html