协程

协程同步

  1. sync.WaitGroup

    sync.WaitGroup 只有三个方法, Add() 添加计数,Done() 计数减一, Wait() 阻塞,直到计数为0。

    var wg sync.WaitGroup
    
    func task(i int) {
        defer wg.Done()
        fmt.Println(i)
    }
    
    func main() {
        for i := 0; i < 10; i++ {
            wg.Add(1)
            go task(i)
        }
    
        wg.Wait()
    }
    
  2. 有缓存 channel

    有缓存 channel 不能保证 goroutine 的有序执行。

    var ch = make(chan int, 10)
    
    func task(i int) {
        fmt.Println(i)
        time.Sleep(time.Second)
        <- ch
    }
    
    func main() {
        for i := 0; i < 10; i++ {
            go task(i)
            ch <- i
        }
    }
    
  3. 无缓存 channel

    无缓存 channel 可以保证 goroutine 的有序执行。

    var ch = make(chan int)
    
    func task(i int) {
        fmt.Println(i)
        time.Sleep(time.Second)
        <- ch
    }
    
    func main() {
        for i := 0; i < 10; i++ {
            go task(i)
            ch <- i
        }
    }