¿Hay alguna manera de hacer tareas repetitivas en segundo plano en Go? Estoy pensando en algo como Timer.schedule(task, delay, period)
en Java. Sé que puedo hacer esto con una gorutina y Time.sleep()
, pero me gustaría algo que se detuviera fácilmente.
Esto es lo que obtuve, pero me parece feo. ¿Hay una forma más limpia / mejor?
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)
donde el período es unint
Respuestas:
La función
time.NewTicker
crea un canal que envía un mensaje periódico y proporciona una forma de detenerlo. Úselo algo como esto (no probado):Puede detener el trabajador mediante el cierre del
quit
canal:close(quit)
.fuente
do stuff
una rutina de inicio o, de lo contrario, el siguiente trabajador se ejecutará de inmediato (cuando necesite más de 5 segundos).close(quit)
cuando quieras detener el programador.go func() { /*do stuff */ }()
.¿Qué tal algo como
Patio de recreo
fuente
time.Ticker
es mejor quetime.After
donde preferiría mantener la tarea a tiempo frente a una brecha arbitraria entre ejecuciones.If efficiency is a concern, use NewTimer
Si no le importa el cambio de tick (dependiendo de cuánto tiempo tardó previamente en cada ejecución) y no desea usar canales, es posible usar la función de rango nativo.
es decir
Patio de recreo
fuente
Echa un vistazo a esta biblioteca: https://github.com/robfig/cron
Ejemplo como a continuación:
fuente
Una respuesta más amplia a esta pregunta podría considerar el enfoque de bloques de Lego que se usa a menudo en Occam y se ofrece a la comunidad Java a través de JCSP . Hay una muy buena presentación de Peter Welch sobre esta idea.
Este enfoque plug-and-play se traduce directamente en Go, porque Go usa los mismos fundamentos del Proceso secuencial de comunicación que Occam.
Entonces, cuando se trata de diseñar tareas repetitivas, puede construir su sistema como una red de flujo de datos de componentes simples (como gorutinas) que intercambian eventos (es decir, mensajes o señales) a través de canales.
Este enfoque es compositivo: cada grupo de componentes pequeños puede comportarse como un componente más grande, hasta el infinito. Esto puede ser muy poderoso porque los sistemas concurrentes complejos están hechos de ladrillos fáciles de entender.
Nota al pie: en la presentación de Welch, usa la sintaxis de Occam para los canales, ¡lo cual es ! y ? y estos corresponden directamente a ch <- y <-ch en Go.
fuente
Yo uso el siguiente código:
Es más simple y funciona bien para mí.
fuente
Si quieres detenerlo en cualquier momento ticker
Si no desea detenerlo, marque :
fuente