一段时间后,运行 函数最好使用什么?
What is better to use for running function after some time?
用什么比较好? time.AfterFunc 或 goroutine with sleep?
time.AfterFunc(d, func() {
// things
})
go func() {
time.Sleep(d)
// things
}()
像大多数计算机科学问题一样 - 答案取决于用途。您的两个选择都将创建一个 goroutine。话虽如此,我会避免 time.Sleep()
因为它是不间断的。
看一个人为的轮询服务示例:
func poller(ctx context.Context) (err error) {
for {
if err = pollRecords(ctx); err != nil {
return
}
time.Sleep(1*time.Hour) // <- poll interval cannot be interrupted
}
}
由于 time.Sleep
.
的不间断特性,此函数可能会 运行 长达一个小时,即使上下文已被取消也是如此
要修复,可以使用基于 time.After()
:
的频道
// time.Sleep(1*time.Hour)
select {
case <-ctx.Done():
return ctx.Err() // cancelling the context interrupts the time.After
case <-time.After(1*time.Hour):
}
注意time.AfterFunc可以取消-但需要捕获返回的time.TImer
:
t := time.AfterFunc(d, func() {
// things
})
// ...
t.Stop() // will stop the function firing - if one decides to do so
用什么比较好? time.AfterFunc 或 goroutine with sleep?
time.AfterFunc(d, func() {
// things
})
go func() {
time.Sleep(d)
// things
}()
像大多数计算机科学问题一样 - 答案取决于用途。您的两个选择都将创建一个 goroutine。话虽如此,我会避免 time.Sleep()
因为它是不间断的。
看一个人为的轮询服务示例:
func poller(ctx context.Context) (err error) {
for {
if err = pollRecords(ctx); err != nil {
return
}
time.Sleep(1*time.Hour) // <- poll interval cannot be interrupted
}
}
由于 time.Sleep
.
要修复,可以使用基于 time.After()
:
// time.Sleep(1*time.Hour)
select {
case <-ctx.Done():
return ctx.Err() // cancelling the context interrupts the time.After
case <-time.After(1*time.Hour):
}
注意time.AfterFunc可以取消-但需要捕获返回的time.TImer
:
t := time.AfterFunc(d, func() {
// things
})
// ...
t.Stop() // will stop the function firing - if one decides to do so