【问题标题】:running a function periodically in go在 go 中定期运行一个函数
【发布时间】:2017-03-14 20:09:45
【问题描述】:

我有这样的功能:

func run (cmd string) [] byte {
    out,err = exec.Command(cmd).Output()
    if error!=nil { 
        log.Fatal (err) 
    }
    return out
}

我想这样运行这个命令

run ("uptime") // run every 5 secs
run ("date") // run every 10 secs

我想运行这些命令并收集它的输出并用它做一些事情。我将如何在 go 中执行此操作?

【问题讨论】:

  • time.Ticker 定期(在频道上)发送通知。您可以为每个调用使用一个 goroutine,该调用使用代码以所需的时间间隔运行命令。
  • 不知道为什么我投了反对票,这是一个很明显的问题吗?
  • 你也可能对 cron 包感兴趣:github.com/robfig/cron

标签: go concurrency


【解决方案1】:

使用time.Ticker。有很多方法可以构建程序,但您可以从一个简单的 for 循环开始:

uptimeTicker := time.NewTicker(5 * time.Second)
dateTicker := time.NewTicker(10 * time.Second)

for {
    select {
    case <-uptimeTicker.C:
        run("uptime")
    case <-dateTicker.C:
        run("date")
    }
}

然后,您可能希望在 goroutine 中运行这些命令,如果它们可能需要比最短时间间隔更长的时间来避免 for 循环中的积压。或者,每个 goroutine 可以有自己的带有单个 Ticker 的 for 循环。

【讨论】:

    【解决方案2】:
    func main() {
        for range time.Tick(time.Second * 10) {
            function_name()
        }
    }
    

    【讨论】:

    • 喜欢这个解决方案,因为它对刚开始使用 golang 且渠道知识有限的新手很简单
    【解决方案3】:

    我建议检查这个包。 https://godoc.org/github.com/robfig/cron

    你甚至可以使用秒。

    c := cron.New(cron.WithSeconds())
    c.AddFunc("*/5 * * * * *", func() { fmt.Println("Testing every 5 seconds.") })
    c.Start()
    

    【讨论】:

    • 感谢这个 cron 库的例子,因为 Linux 上的 Cron 没有“秒”间隔,但是这个 golang 库有。
    猜你喜欢
    • 1970-01-01
    • 2016-11-27
    • 2023-02-03
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    相关资源
    最近更新 更多