zoukankan      html  css  js  c++  java
  • goroutine 通过waitgroup 确保 goroutine执行完成,select+time.After+chanel 终止goroutine等待

    package main
    
    import (
       "fmt"
       "log"
       "sync"
       "time"
    )
    
    func main() {
       tasks := make(chan bool, 1)
       go func(t chan bool){
          var wg sync.WaitGroup
          // 需要确保3个协程完成
          for i := 1; i <= 3; i++ {
             wg.Add(1)
             go func(ii int) {
                defer panicRecover()
                if err := testa(ii); err != nil {
                   t <- false
                }
                wg.Done()
             }(i)
          }
          wg.Wait()
          t <- true
       }(tasks)
    
    
       // 限时120s等待协程完毕
       select {
       case <-time.After(time.Second * 120):
          fmt.Println("处理超时")
       case flag := <-tasks:
          if !flag {
             fmt.Println("多协程任务中有失败的")
          }else {
             log.Println("协程正确完成任务")
          }
       }
       fmt.Printf("over")
    }
    
    
    func testa(i int) error {
       time.Sleep(time.Second * 3)
       fmt.Println(i)
       if i == 3 {
          return fmt.Errorf("i can't be 3")
       }
       return nil
    }
    
    func panicRecover(){
       if err := recover(); err != nil {
          log.Printf("recover from panic: %v", err)
       }
    }
    

      

    没有什么是写一万遍还不会的,如果有那就再写一万遍。
  • 相关阅读:
    作业 第四 张垚
    软件测试课堂练习 张垚
    增删改查
    计算器 作业
    activity 张垚
    第四作业 张垚
    第六周作业
    jsp第四周作业
    jsp求1-100之间的素数和
    JSP第一次测试
  • 原文地址:https://www.cnblogs.com/waken-captain/p/10496626.html
Copyright © 2011-2022 走看看