go控制函数执行时间

go如何控制一个函数只执行30S

阅读 5.1k
3 个回答

可以用context.WithTimeout或者context.WithDeadline

   p := context.TODO()
   c, _ := context.WithTimeout(p, 30*time.Second)
   wg := &sync.WaitGroup{}
   wg.Add(1)
   start := time.Now()
   go func(ctx context.Context) {
      defer wg.Done()
      for{
          select {
          case <-c.Done():
             return
          default:
             doSomething() 
          }
      }
   }(c)
   wg.Wait()
   fmt.Println(time.Since(start))

尝试一下定时器

func handle(ffc func(ctx context.Context) interface{}, pfc func(data interface{}) error, ch chan interface{}, timeout time.Duration) (err error) {
   donec := false
 go func() {
      info := ffc(context.TODO()) //执行写入到ch的逻辑
 if !donec {
         ch <- info
      }
   }()
   select {
   case msg, ok := <-ch:
      if ok {
         //pfc 里面实现自己的业务 如加锁等
 return pfc(msg) //出ch的逻辑
 }
      break
 case <-time.After(timeout): //多少秒内没处理完毕 做报警处理
 //报警业务 donec = true
 return errors.New("time out")
   }
   return nil
}
推荐问题