2016-11-01 1 views
2

У меня есть функция, как это:работает функция периодически в ходу

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 

Я хотел бы, чтобы запустить эти команды и собирать свою продукцию и что-то с этим делать. Как мне это сделать?

+0

'time.Ticker' отправляет уведомления через определенные промежутки времени (по каналу). У вас может быть goroutine для каждого из этих вызовов, который использует тикер для запуска команды с нужным интервалом. –

+0

Не знаете, почему я получил отрицательный голос, неужели это такой очевидный вопрос? – NinjaGaiden

+0

Вам также может быть интересен пакет cron: https://github.com/robfig/cron – user114241

ответ

7

Использовать time.Ticker. Там же много способов структурировать программу, но вы можете начать с простой цикл:

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. В качестве альтернативы, каждый горутин может иметь свой собственный цикл с одним тикером.

Смежные вопросы