Existe-t-il un moyen d'effectuer des tâches répétitives en arrière-plan dans Go? Je pense à quelque chose comme Timer.schedule(task, delay, period)
à Java. Je sais que je peux faire ça avec un goroutine et Time.sleep()
, mais j'aimerais quelque chose qui s'arrête facilement.
Voici ce que j'ai, mais me semble laid. Existe-t-il un moyen plus propre / meilleur?
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)
où la période est uneint
Réponses:
La fonction
time.NewTicker
crée un canal qui envoie un message périodique et fournit un moyen de l'arrêter. Utilisez-le quelque chose comme ça (non testé):Vous pouvez arrêter le travailleur en fermant le
quit
canal:close(quit)
.la source
do stuff
une routine go, sinon le travailleur suivant s'exécuterait immédiatement (lorsqu'il aurait besoin de plus de 5 secondes).close(quit)
moment où vous souhaitez arrêter le planificateur.go func() { /*do stuff */ }()
.Et quelque chose comme
Terrain de jeux
la source
time.Ticker
est préférable à l'time.After
endroit où vous préférez maintenir la tâche dans les délais, par rapport à un écart arbitraire entre les exécutions.If efficiency is a concern, use NewTimer
Si vous ne vous souciez pas du décalage des ticks (en fonction du temps que cela a pris précédemment à chaque exécution) et que vous ne souhaitez pas utiliser de canaux, il est possible d'utiliser la fonction de plage native.
c'est à dire
Terrain de jeux
la source
Consultez cette bibliothèque: https://github.com/robfig/cron
Exemple comme ci-dessous:
la source
Une réponse plus large à cette question pourrait considérer l'approche brique Lego souvent utilisée en Occam, et proposée à la communauté Java via JCSP . Il y a une très bonne présentation de Peter Welch sur cette idée.
Cette approche plug-and-play se traduit directement par Go, car Go utilise les mêmes principes de base du processus séquentiel de communication que Occam.
Ainsi, quand il s'agit de concevoir des tâches répétitives, vous pouvez construire votre système comme un réseau de flux de données de composants simples (comme des goroutines) qui échangent des événements (c'est-à-dire des messages ou des signaux) via des canaux.
Cette approche est compositionnelle: chaque groupe de petits composants peut lui-même se comporter comme un composant plus grand, à l'infini. Cela peut être très puissant car les systèmes concurrents complexes sont fabriqués à partir de briques faciles à comprendre.
Note de bas de page: dans la présentation de Welch, il utilise la syntaxe Occam pour les canaux, qui est ! et ? et ceux-ci correspondent directement à ch <- et <-ch dans Go.
la source
J'utilise le code suivant:
C'est plus simple et ça me convient.
la source
Si vous voulez l'arrêter à tout moment, ticker
Si vous ne souhaitez pas l'arrêter, cochez :
la source