menu

golang使用Context实现简单的超时机制

  • date_range 20/09/2020 00:00 info
    sort
    notes
    label
    notes

Golang可以使用很多方案实现超时机制,比如ChannelTimeAfterContext,下文使用官方提供的Context包来实现一个简单的超时机制。

var wg = sync.WaitGroup{}
func main() {
    wg.Add(1)
    
	result :=Invoke(1*time.Second, func(resultChan chan<- interface{}) {
		log.Println("开始搞事情...")
		
		//将sleep注释掉 写入resultChan查看未超时返回结果的内容
		time.Sleep(5*time.Second)
		//resultChan<-"i not time out"
	})
	wg.Done()
	wg.Wait()

	log.Println("invoke result:",result)
	log.Println("end")
}

//超时机制
func Invoke(time time.Duration,callback func(resultChan chan<- interface{})) interface{}{
	resultChan := make(chan interface{}) //写入结果的chan
	ctx , cancel := context.WithTimeout(context.Background(),time) //创建一个context
	go callback(resultChan) //执行函数
	//二选一,要么超时,要么收到结果
	select {
		case data:=<-resultChan: //监听结果信号
			return data
		case <- ctx.Done(): //监听超时信号
			cancel()
			log.Println("time out!")
			return nil
	}
}