gpt4 book ai didi

go - Tick()周期内的Sleep()

转载 作者:行者123 更新时间:2023-12-01 21:18:09 25 4
gpt4 key购买 nike

我有一个摘要:

func TestTicks(t *testing.T) {
go func() {
for range time.Tick(600 * time.Millisecond) {
log.Println("Tick")
}
}()
time.Sleep(5000 * time.Millisecond)
}

我可以打印8行(5000 div 600 = 8),这很有意义:
2020/04/15 14:51:08 Tick
2020/04/15 14:51:09 Tick
2020/04/15 14:51:09 Tick
2020/04/15 14:51:10 Tick
2020/04/15 14:51:10 Tick
2020/04/15 14:51:11 Tick
2020/04/15 14:51:12 Tick
2020/04/15 14:51:12 Tick

但是,当我在其中添加 Sleep()时,它并不太清楚:
func TestTicks(t *testing.T) {
go func() {
for range time.Tick(600 * time.Millisecond) {
log.Println("Tick")
time.Sleep(500 * time.Millisecond)
}
}()
time.Sleep(5000 * time.Millisecond)
}

我希望它将被打印4次(5000 div 1100 = 4)。但实际上它仍然被打印8次:
2020/04/15 14:53:17 Tick
2020/04/15 14:53:18 Tick
2020/04/15 14:53:18 Tick
2020/04/15 14:53:19 Tick
2020/04/15 14:53:19 Tick
2020/04/15 14:53:20 Tick
2020/04/15 14:53:21 Tick
2020/04/15 14:53:21 Tick

为什么内部 Sleep()不影响执行?

如果我进一步修改它:
func TestTicks(t *testing.T) {
go func() {
for range time.Tick(1000 * time.Millisecond) {
log.Println("Tick")
time.Sleep(1000 * time.Millisecond)
}
}()
time.Sleep(5000 * time.Millisecond)
}

它被打印了4次,而我希望它仅被打印2次(5000 div 2000 = 2)。

我想我误解了 Sleep()for range time.Tick()东西如何协同工作...

最佳答案

time.Tick创建一个以给定频率计时的计时器。这些滴答声会在 channel 上发送。 time.Tick返回该 channel 。因此,这大致相等:

func TestTicks(t *testing.T) {
go func() {
c := time.Tick(600 * time.Millisecond)
for range c {
log.Println("Tick")
}
}()
time.Sleep(5000 * time.Millisecond)
}

请注意,到达 channel c的报价是从第三个(系统提供的不可见)goroutine发送的。

如果现在将 time.Sleep调用添加到匿名goroutine中,您是否希望这会影响在 channel c上发送报价的系统goroutine? (如果是这样,为什么?)

假设您不希望这样-您希望系统goroutine将继续每600 ms唤醒一次,并尝试使用以下命令将时间值填充到 c中:
now = time.Now()
select {
case c <- now:
default:
}

-那么,为什么期望 for range time.Tick(arg)变体有什么不同?无论是否将返回值存储在名为 time.Tick(arg)的变量中,函数 c仅被调用一次。

关于go - Tick()周期内的Sleep(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61229386/

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