下面的代码:
// Sample program to show how to use the WithDeadline function
// of the Context package.
package main
import (
"context"
"fmt"
"time"
)
type data struct {
UserID string
}
func main() {
// Set a duration.
// duration := 150 * time.Millisecond
duration := time.Now().Add(3 * time.Second)
// Create a context that is both manually cancellable and will signal
// a cancel at the specified duration.
ctx, cancel := context.WithDeadline(context.Background(), duration)
defer cancel()
// Create a channel to received a signal that work is done.
ch := make(chan data, 1)
// Ask the goroutine to do some work for us.
go func() {
// Simulate work.
time.Sleep(50 * time.Millisecond)
// Report the work is done.
ch <- data{"123"}
}()
// Wait for the work to finish. If it takes too long move on.
select {
case d := <-ch:
fmt.Println("work complete", d)
case <-ctx.Done():
fmt.Println("work cancelled")
}
}
正在使用WithDeadline
发送计时器发送的cancel()
。可以使用以下方法完成:
duration := 150 * time.Millisecond
// Create a context that is both manually cancellable and will signal
// a cancel at the specified duration.
ctx, cancel := context.WithTimeout(context.Background(), duration)
在内部,context.WithTimeout
调用context.WithDeadline
函数并通过将超时添加到当前时间来生成截止日期。
context.WithTimeout()
与context.WithDeadline()
的区别
答案 0 :(得分:4)
WithTimeout
是执行WithDeadline(parent, time.Now().Add(timeout))
的便捷功能。
功能在应用程序指定截止日期的方式方面有所不同。否则它们是相同的。
调用适合您现有值的函数。
答案 1 :(得分:3)
context.WithTimeout()与context.WithDeadline()有何不同
第一个需要一段时间才能从现在开始取消,第二个是调用取消的绝对时间,如文档中所述,值得照常阅读。