4 - accetta rapidamente i compiti in arrivo,
5 - restituisce il risultato del compito su richiesta
6 - se non c'è risultato, restituisce lo stato appropriato
/*
Processore - un servizio che esegue un'operazione lunga e intensiva in risorse. È già implementato
Gli errori che restituisce sono esclusivamente legati a dati di input incorretti, sono stabili e richiederli di nuovo è inutile
*/
type Processor interface {
Process([]byte) ([]byte, error)
}
/*
Supponiamo di avere un generatore di identificatori unici (ad esempio UUID).
Il generatore garantisce che non ci saranno collisioni
*/
type ID string
// func NewID() ID
/*
Il pianificatore accetta compiti dai clienti, li mette in coda e li avvia nel processamento.
Assicura che non più di 'threads' metodi di processo siano in esecuzione contemporaneamente
Permette di verificare lo stato del compito e ottenere il risultato
non blocca i metodi pubblici per il processamento
*/
type Scheduler struct {
processor Processor
}
func NewScheduler(
prc Processor,
threads int,
) *Scheduler {
// logica di inizializzazione
return &Scheduler{
processor: prc,
}
}
func (s *Scheduler) Queue(request []byte) ID {
// implementare
return ""
}