主协程如何等待其余协程完再操作

本文阅读 1 分钟
首页 golang 正文

题目序号:(421, 3235)

题目来源:腾讯

频次:2

答案1:(dema)

  1. Sleep(不常用),在main方法退出之前 sleep 一段时间

    package main
    
    import (
        "fmt"
        "time"
    )
    
    func main() {
        go func1()
        fmt.Println("main")
        // 这里睡眠一秒,等待其他协程结束
        time.Sleep(1 * time.Second)
    }
    
    func func1() {
        fmt.Println("func1")
    }
  2. 通道(不常用),每个活动结束从通道中取出一个值,当所有活动的协程结束,关闭通道

    package main
    
    import (
        "fmt"
    )
    
    var (
        ch    = make(chan struct{})
        count = 1 // 表示协程数
    )
    
    func main() {
        go func1()
        fmt.Println("main")
        for range ch {
            // 每次取值将count减1,当count为0时关闭通道
            count--
            if count == 0 {
                close(ch)
            }
        }
    }
    
    func func1() {
        fmt.Println("func1")
        ch <- struct{}{}
    }
  3. sync.WaitGroup(常用)

    package main
    
    import (
        "fmt"
        "sync"
    )
    
    var wg sync.WaitGroup
    
    func main() {
        wg.Add(1) // 添加计数
        go func1()
        fmt.Println("main")
        wg.Wait() // 等待计数变为0
    }
    
    func func1() {
        fmt.Println("func1")
        wg.Done() // 将计数减1
    }
    
本文来自投稿,不代表本站立场,如若转载,请注明出处:
syncpool的实现原理
« 上一篇 09-17
问了sync.Map(我说我对sync.Pool比较熟,就说Pool了)
下一篇 » 09-17

发表评论

发表评论