一段时间后,运行 函数最好使用什么?

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