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())
	}
}