我想在 Go 程序中进行一些连续的函数调用,例如
(显然省略了错误检查)
result1, err := fxn1()
result2, err := fxn2()
我希望整个调用序列在一定时间内完成,否则应该中止该过程(并且程序退出错误)
假设我有超时(作为持续时间)以某种方式传递到我的程序中,我想一种方法是
a)创建一个带有截止日期的上下文,将超时添加到当前时间
myDeadline := time.Now().Add(timeout * time.Second)
ctx, cancel := context.WithDeadline(context.Background(), myDeadline)
defer cancel()
b)让最终函数通过通道传达其结果(我认为这称为通道生成器模式?)
func fxn2() (chan string) {
resChan := make(chan string)
go func() {
// get the job done
resChan <- result
}()
return resChan
}
和
c ) 然后在 select 语句上阻塞主 goroutine,如下所示
select {
case err := <-ctx.Done():
log.Println("Process has timed out...exiting")
os.Exit(err)
case result := <- resChan
log.Println("Process completed in time")
}
这是我现在能想到的最好的方法,但我在徘徊是否有更好或更惯用的方式(比如为每个函数生成新的上下文副本 - 当然应该接受context.Context
作为输入参数)以某种方式跟踪剩余时间?)