Golang中注册等待时间的优化探讨

Golang中注册等待时间的优化探讨 我需要在我的应用程序中每0到5秒验证几个条件?有人能帮忙写一下等待0到5秒的代码吗?

谢谢

// 等待0到5秒的示例代码
time.Sleep(time.Duration(rand.Intn(6)) * time.Second)
8 回复

感谢 Nobbz

更多关于Golang中注册等待时间的优化探讨的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


为什么不直接使用 time.Ticker

嗯,但是你的实现可能会导致验证重叠,这可能只是另一个不好的情况。

既是也不是,这取决于你如何划分验证批次。但确实,你需要小心处理。

我认为Timer和Ticker在一个重要方面存在差异。根据我阅读的Ticker文档:"它会调整间隔或丢弃tick以弥补接收缓慢的情况。"这听起来很奇怪,它可能会丢弃一些tick。除非确实不需要,否则我更倾向于确保规律性。

这取决于您需要在函数调用后0到5秒内运行代码(可能会持续一段时间),还是需要每隔0到5秒调用一次函数(即使上次调用尚未完成运行)。您需要哪种方案?

如果您严格要求每5秒执行一次验证,无论验证过程需要多长时间,您可能需要更复杂的方案,例如:

package main

import "time"
import "fmt"

func validate(c1 chan <- string) {
	time.Sleep(2 * time.Second)
	c1 <- "result"
}


func scheduleValidation (c1 chan <- string) {

	go func () {
		 <-time.After(5 * time.Second)
		 fmt.Println(time.Now())
		 scheduleValidation(c1)
		 validate(c1)
	} ()

}
func main() {
		c1 := make(chan string)
		scheduleValidation(c1)
			
		for {
			select {
			case r := <- c1:
				fmt.Println(r)
			}
		}
}

这是一个很好的问题。在Go语言中实现0到5秒的随机等待时间,您提供的代码基本正确,但需要引入math/rand包并初始化随机数种子,否则每次运行都会得到相同的随机序列。

以下是更完整的实现方案:

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    // 初始化随机数种子
    rand.Seed(time.Now().UnixNano())
    
    for i := 0; i < 5; i++ {
        // 生成0-5秒的随机等待时间
        waitTime := time.Duration(rand.Intn(6)) * time.Second
        fmt.Printf("等待 %v 秒\n", waitTime)
        
        // 执行等待
        time.Sleep(waitTime)
        
        // 这里可以添加您的条件验证逻辑
        fmt.Printf("第%d次验证条件\n", i+1)
    }
}

如果您使用的是Go 1.20及以上版本,推荐使用新的math/rand/v2包:

package main

import (
    "fmt"
    "math/rand/v2"
    "time"
)

func main() {
    for i := 0; i < 5; i++ {
        // 使用rand.v2,无需手动设置种子
        waitTime := time.Duration(rand.IntN(6)) * time.Second
        fmt.Printf("等待 %v 秒\n", waitTime)
        
        time.Sleep(waitTime)
        
        // 您的条件验证逻辑
        fmt.Printf("第%d次验证条件\n", i+1)
    }
}

对于需要持续验证条件的场景,可以使用goroutine实现非阻塞的定时检查:

func continuousValidation() {
    ticker := time.NewTicker(1 * time.Second)
    defer ticker.Stop()
    
    for range ticker.C {
        // 每1秒检查一次条件
        if shouldValidate() {
            // 执行验证逻辑
            validateConditions()
        }
    }
}

您提供的代码思路是正确的,只需要确保正确导入包和初始化随机数种子即可满足0到5秒随机等待的需求。

回到顶部