go中定期运行一个函数

时间:2016-11-01 16:26:24

标签: go concurrency

我有这样的功能:

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

我想运行这些命令并收集其输出并使用它做一些事情。我怎么会这样做?

3 个答案:

答案 0 :(得分:11)

使用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")
    }
}

如果可能需要比最短间隔更长的时间来避免for循环中的积压,那么您可能希望在goroutine中运行命令。或者,每个goroutine都可以使用单个Ticker进行自己的for循环。

答案 1 :(得分:2)

func main() {
    for range time.Tick(time.Second * 10) {
        function_name()
    }
}

答案 2 :(得分:0)

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

您甚至可以使用秒。

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