X小时后如何有效地调用func?

fis*_*ker 5 go

我知道我可以这样做:

func randomFunc() {
    // do stuff
    go destroyObjectAfterXHours(4, "idofobject")
    // do other stuff
}

func destroyObjectAfterXHours(hours int, id string) {
    time.Sleep(hours * time.Hour)
    destroyObject(id)
}
Run Code Online (Sandbox Code Playgroud)

但是如果我们想象destroyObjectAfterXHours在几分钟内被调用一百万次,这个解决方案就会很糟糕。

我希望有人可以分享一个更有效的解决方案来解决这个问题。

我一直在考虑一个潜在的解决方案,其中销毁时间和对象 id 存储在某处,然后会有一个 func 每 X 分钟遍历一次列表,销毁必须销毁的对象并删除它们的 id 和时间来自该信息存储位置的信息。这会是一个很好的解决方案吗?

我担心这也是一个糟糕的解决方案,因为您将不得不一直遍历包含数百万个项目的列表,然后必须有效地删除一些项目等。

Cer*_*món 16

time.AfterFunc功能是专为这种使用情况:

func randomFunc() {
    // do stuff
    time.AfterFunc(4*time.Hour, func() { destroyObject("idofobject") })
    // do other stuff
}
Run Code Online (Sandbox Code Playgroud)

time.AfterFunc 高效且易于使用。

正如文档所述,该函数在持续时间过去后在 goroutine 中被调用。goroutine 不是像问题中那样预先创建的。