golang 并发控制

golang 的并发控制可以通过 channel WaitGroup context 等三种方式实现

  • channel
func main {
    fmt.PrintLn("start")
    doSomething()
    fmt.PrintLn("end")
}

func doSomething() {
    ch := make(chan struct{})
    go func(){
        for {
           select {
           case <-ch:
                fmt.Println("goroutine exit")
                return
           default:
                fmt.Println("goroutine running")
                time.Sleep(1 * time.Second)
           } 
        }
    }()
    
    time.Sleep(2 * time.Second)
    ch <- struct{}{}
    time.Sleep(2 * time.Second)
    fmt.Println("main fun exit")
}
  • WaitGroup
func main(){
    var wg sync.WaitGroup
    wg.Add(2)
    go func(){
       def func(){
          wg.Done() 
       }()
       fmt.PrintLn("gorouting A") 
    }()
    
    go func(){
       def func(){
          wg.Done() 
       }()
       fmt.PrintLn("gorouting B") 
    }()
    wg.Wait()
    
    time.Sleep(2 * time.Second)
    fmt.Println("main fun exit")
}
  • context
func main(){
    ctx, cancel := context.WithCancel(context.Background())
    go func(ctx context.Context){
        for {
            select {
            case <-ctx.Done():
                fmt.Println("goroutine exit")
                return
            default:
                fmt.Println("goroutine running")
            }
        }
    }(ctx)
    
    time.Sleep(5 * time.Second)
    fmt.Println("main fun exit")
    cancel()
    time.Sleep(5 * time.Second)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值