Czy istnieje sposób na wykonywanie powtarzalnych zadań w tle w Go? Myślę o czymś takim, jak Timer.schedule(task, delay, period)
w Javie. Wiem, że mogę to zrobić za pomocą gorutyny i Time.sleep()
, ale chciałbym coś, co można łatwo zatrzymać.
Oto, co mam, ale dla mnie wygląda brzydko. Czy istnieje czystszy / lepszy sposób?
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)
tam , gdzie okres jestint
Odpowiedzi:
Funkcja
time.NewTicker
tworzy kanał, który wysyła okresową wiadomość i zapewnia sposób jej zatrzymania. Użyj czegoś takiego (nieprzetestowane):Można zatrzymać pracownika przez zamknięcie
quit
kanału:close(quit)
.źródło
do stuff
rutynę go, w przeciwnym razie następny pracownik wykonałby natychmiast (gdy potrzebuje więcej niż 5 sekund).close(quit)
wtedy, gdy chcesz zatrzymać harmonogram.go func() { /*do stuff */ }()
.Co powiesz na coś takiego
Plac zabaw
źródło
time.Ticker
jest lepsze niż miejsce, wtime.After
którym wolisz trzymać zadanie zgodnie z harmonogramem, a nie dowolna przerwa między wykonaniami.If efficiency is a concern, use NewTimer
Jeśli nie przejmujesz się przesuwaniem tików (w zależności od tego, jak długo trwało to poprzednio przy każdym wykonaniu) i nie chcesz korzystać z kanałów, to możesz skorzystać z natywnej funkcji range.
to znaczy
Plac zabaw
źródło
Sprawdź tę bibliotekę: https://github.com/robfig/cron
Przykład jak poniżej:
źródło
Szersza odpowiedź na to pytanie może obejmować podejście z klocków Lego, często używane w Occam i oferowane społeczności Java za pośrednictwem JCSP . Peter Welch przedstawia bardzo dobrą prezentację tego pomysłu.
To podejście typu plug-and-play przekłada się bezpośrednio na Go, ponieważ Go wykorzystuje te same podstawy komunikacyjnego procesu sekwencyjnego, co Occam.
Tak więc, jeśli chodzi o projektowanie powtarzalnych zadań, możesz zbudować swój system jako sieć przepływu danych składającą się z prostych komponentów (takich jak gorutyny), które wymieniają zdarzenia (tj. Komunikaty lub sygnały) kanałami.
Podejście to ma charakter kompozycyjny: każda grupa małych komponentów może sama zachowywać się jak większy komponent w nieskończoność. Może to być bardzo potężne, ponieważ złożone systemy współbieżne są zbudowane z łatwych do zrozumienia cegieł.
Przypis: w prezentacji Welcha używa on składni Occam dla kanałów, czyli ! i ? a te bezpośrednio odpowiadają ch <- i <-ch w Go.
źródło
Używam następującego kodu:
Jest to prostsze i dla mnie działa dobrze.
źródło
Jeśli chcesz to zatrzymać w dowolnym momencie ticker
Jeśli nie chcesz, aby zatrzymać go zaznaczyć :
źródło