gpt4 book ai didi

go - 在 Go 中以一定间隔同时运行多个函数

转载 作者:IT王子 更新时间:2023-10-29 02:25:45 28 4
gpt4 key购买 nike

我有一个函数列表和它们各自的间隔。我想同时运行每个函数的时间间隔。

在 JavaScript 中,我写了类似这样的东西:

maps.forEach(({fn, interval}) => {
setInterval(fn, interval)
})

如何在 Golang 中实现此功能?

最佳答案

使用 time.Ticker定期接收“事件”,您可以使用它来为函数的执行计时。您可以通过调用 time.NewTicker() 获得 time.Ticker .返回的代码有一个定期发送值的 channel 。

使用 goroutine 持续接收事件并调用函数,例如使用 for range 循环。

让我们看看 2 个函数:

func oneSec() {
log.Println("oneSec")
}

func twoSec() {
log.Println("twoSec")
}

这是一个定期调用给定函数的简单调度程序:

func schedule(f func(), interval time.Duration) *time.Ticker {
ticker := time.NewTicker(interval)
go func() {
for range ticker.C {
f()
}
}()
return ticker
}

使用示例:

func main() {
t1 := schedule(oneSec, time.Second)
t2 := schedule(twoSec, 2*time.Second)
time.Sleep(5 * time.Second)
t1.Stop()
t2.Stop()
}

示例输出(在 Go Playground 上尝试):

2009/11/10 23:00:01 oneSec
2009/11/10 23:00:02 twoSec
2009/11/10 23:00:02 oneSec
2009/11/10 23:00:03 oneSec
2009/11/10 23:00:04 twoSec
2009/11/10 23:00:04 oneSec

请注意 Ticker.Stop() 不会关闭代码 channel ,因此 for range 不会终止; Stop() 仅停止在代码 channel 上发送值。

如果您想终止用于安排函数调用的 goroutine,您可以使用额外的 channel 来完成。然后那些 goroutines 可能会使用 select 语句来“监控”ticker 的 channel 和这个 done channel ,如果从 done 接收成功则返回。

例如:

func schedule(f func(), interval time.Duration, done <-chan bool) *time.Ticker {
ticker := time.NewTicker(interval)
go func() {
for {
select {
case <-ticker.C:
f()
case <-done:
return
}
}
}()
return ticker
}

并使用它:

func main() {
done := make(chan bool)
t1 := schedule(oneSec, time.Second, done)
t2 := schedule(twoSec, 2*time.Second, done)
time.Sleep(5 * time.Second)
close(done)
t1.Stop()
t2.Stop()
}

Go Playground 上试试这个.

请注意,即使在这个简单的示例中没有必要停止代码(因为 when the main goroutine ends, so does the program with it ),在现实生活中,如果应用程序继续运行,保持代码不停止会浪费资源(它们将继续使用后台goroutine,并将继续尝试在他们的 channel 上发送值)。

遗言:

如果您有一段函数间隔对,只需使用一个循环将每一对传递给此 schedule() 函数。像这样:

type pair struct {
f func()
interval time.Duration
}

pairs := []pair{
{oneSec, time.Second},
{twoSec, 2 * time.Second},
}

done := make(chan bool)
ts := make([]*time.Ticker, len(pairs))
for i, p := range pairs {
ts[i] = schedule(p.f, p.interval, done)
}

time.Sleep(5 * time.Second)
close(done)

for _, t := range ts {
t.Stop()
}

Go Playground 上试试这个.

关于go - 在 Go 中以一定间隔同时运行多个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52381764/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com