Existe uma maneira de executar tarefas repetitivas em segundo plano no Go? Estou pensando em algo como Timer.schedule(task, delay, period)
em Java. Eu sei que posso fazer isso com uma goroutine e Time.sleep()
, mas eu gostaria de algo que parasse facilmente.
Aqui está o que eu consegui, mas me parece feio. Existe uma maneira mais limpa / melhor?
func oneWay() {
var f func()
var t *time.Timer
f = func () {
fmt.Println("doing stuff")
t = time.AfterFunc(time.Duration(5) * time.Second, f)
}
t = time.AfterFunc(time.Duration(5) * time.Second, f)
defer t.Stop()
//simulate doing stuff
time.Sleep(time.Minute)
}
t := time.Tick(time.Duration(period) * time.Second)
onde o período é umint
Respostas:
A função
time.NewTicker
cria um canal que envia uma mensagem periódica e fornece uma maneira de pará-lo. Use algo assim (não testado):Você pode parar o trabalhador fechando o
quit
canal:close(quit)
.fonte
do stuff
uma rotina de execução ou o próximo trabalhador executará imediatamente (quando precisar de mais de 5 segundos).close(quit)
quando deseja parar o agendador.go func() { /*do stuff */ }()
.Que tal algo como
Parque infantil
fonte
time.Ticker
é melhor do quetime.After
onde você prefere manter a tarefa dentro do cronograma versus um intervalo arbitrário entre as execuções.If efficiency is a concern, use NewTimer
Se você não se importa com a troca de marcações (dependendo de quanto tempo demorou anteriormente em cada execução) e não deseja usar canais, é possível usar a função de intervalo nativo.
ie
Parque infantil
fonte
Confira esta biblioteca: https://github.com/robfig/cron
Exemplo como abaixo:
fonte
Uma resposta mais ampla a essa pergunta pode considerar a abordagem de blocos de Lego frequentemente usada no Occam e oferecida à comunidade Java via JCSP . Há uma apresentação muito boa de Peter Welch sobre essa idéia.
Essa abordagem plug-and-play se traduz diretamente no Go, porque o Go usa os mesmos fundamentos do Processo Seqüencial de Comunicação que o Occam.
Portanto, quando se trata de projetar tarefas repetitivas, você pode construir seu sistema como uma rede de fluxo de dados de componentes simples (como goroutines) que trocam eventos (ou seja, mensagens ou sinais) por meio de canais.
Essa abordagem é composicional: cada grupo de pequenos componentes pode se comportar como um componente maior, ad infinitum. Isso pode ser muito poderoso, porque sistemas concorrentes complexos são feitos de tijolos fáceis de entender.
Nota de rodapé: na apresentação de Welch, ele usa a sintaxe Occam para canais, o que é ! e ? e estes correspondem diretamente a ch <- e <-ch em Go.
fonte
Eu uso o seguinte código:
É mais simples e funciona bem para mim.
fonte
Se você quiser pará-lo em qualquer momento ticker
Se você não quiser parar, marque :
fonte