Limiti di Tempo
Tramite i ticker è possibile rallentare l'utilizzo della risorsa CPU.
Esempio
(350rate-limiting.go):
// Rallentatore di utilizzo risorse
// Usa goroutines, channels e tickers
package main
import "time"
import "fmt"
func main() {
// Primo semplice esempio
fmt.Println("First 5 every 2seconds")
// Un channel che contiene tutte le richieste
requests := make(chan int, 5)
// Le richieste partono veloci e vengono bufferizzate
for i := 1; i <= 5; i++ {
requests <- i
}
// E' importante la chiusura per segnalare
// la terminazione di richieste
close(requests)
// limiter riceve un valore ogni 2 secondi
// E' il regolatore di velocità
limiter := time.Tick(time.Millisecond * 2000)
// Una richiesta ogni 2 secondi
// finchè il canale non viene chiuso
for req := range requests {
// attende il tick
<-limiter
fmt.Println("request", req, time.Now())
}
// Secondo esempio: burst limiter
fmt.Println("Second")
// Channel bufferizzato abbastanza capiente
burstyLimiter := make(chan time.Time, 3)
// Un burst di 3 richieste quasi con la stessa ora
for i := 0; i < 3; i++ {
burstyLimiter <- time.Now()
}
// Va avanti per sempre a scandire 3 secondi
go func() {
// Ogni tick mette l'ora nel channel
for t := range time.Tick(time.Millisecond * 3000) {
burstyLimiter <- t
}
}()
// Channel di 10 elementi subito riempito
burstyRequests := make(chan int, 10)
for i := 1; i <= 10; i++ {
burstyRequests <- i
}
close(burstyRequests)
// Scandisce il channel
fmt.Println("The first 3 all at once emptying the channel")
fmt.Println("Then every 3 seconds")
for req := range burstyRequests {
// I primi tre hanno quasi la stessa ora
// e arrivano subito
// Gli altri arrivanodopo 3 secondi
<-burstyLimiter
fmt.Println("request", req, time.Now())
}
}