gpt4 book ai didi

go - 我在哪里创建 Ticker 重要吗?

转载 作者:数据小太阳 更新时间:2023-10-29 03:06:07 27 4
gpt4 key购买 nike

有什么区别吗

ticker := time.NewTicker(1 * time.Second)

go func() {
for _ = range ticker.C {
fmt.Print("Tick")
}
}()

time.Sleep(3)
ticker.Stop()

var ticker *time.Ticker

go func() {
ticker = time.NewTicker(1 * time.Second)
for _ = range ticker.C {
fmt.Print("Tick")
}
}()

time.Sleep(3)
ticker.Stop()

就线程安全而言,尤其是当函数中的工作花费的时间超过一个滴答周期时?

我问是因为(当不需要停止 Ticker 时)后者可以缩短为

go func() {
for ticker := time.NewTicker(1 * time.Second) ;; <-ticker.C {
fmt.Print("Tick")
}
}()

而前者不能。这种形式还有一个额外的好处,即第一个价格变动会立即被触发。

最佳答案

第二个版本的代码是错误的:它有一个竞争条件。

var ticker *time.Ticker

go func() {
ticker = time.NewTicker(1 * time.Second)
for _ = range ticker.C {
fmt.Print("Tick")
}
}()

time.Sleep(3)
ticker.Stop()

在 goroutine 中分配给 ticker 和在 ticker.Stop() 调用中使用 ticker 之间没有同步。

在实践中,由于 time.Sleep(3) 较长,这几乎总是无害的,但应尽可能避免此类竞争,因为即使它们今天无害,但以后可能会造成麻烦.例如,如果不是 Sleep,您有一些花费可变时间的代码,如果该代码恰好花费很短的时间,您可能会看到 nil 指针 panic 。

因此,出于这个原因,我总是使用您的代码的第一个版本(在 goroutine 之外创建 ticker 的代码)。

代码的第三个版本(ticker 完全在 goroutine 内部使用)也不错。如果可能的话,我肯定会使用代码的这个较短版本,其中代码是在 goroutine 中定义的。代码的简短性很好,但我也喜欢外面的代码根本看不到代码,因此代码的读者很容易理解代码的范围。

关于go - 我在哪里创建 Ticker 重要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37495107/

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