1. Introduzione

La libreria cron di Golang è uno strumento potente e facile da usare che consente di pianificare l'esecuzione di lavori in momenti o intervalli specifici. È modellato sul servizio cron di UNIX, ma è implementato come libreria autonoma che può essere integrata nelle applicazioni Go. La libreria cron si occupa della pianificazione basata sul tempo, lasciandoti libero di concentrarti sul lavoro che deve essere eseguito.

2. Esempio

Installazione della libreria cron

Per iniziare a utilizzare la libreria cron nel tuo progetto, devi prima installarla utilizzando il comando go get:

go get github.com/robfig/cron/[email protected]

Importa il pacchetto cron

Dopo l'installazione, puoi importarlo nel tuo programma Go nel seguente modo:

import "github.com/robfig/cron/v3"

Ecco un semplice esempio di come impostare un lavoro Cron che stampa un messaggio ogni minuto:

package main

import (
    "fmt"
    "github.com/robfig/cron/v3"
)

func main() {
	c := cron.New()
	c.AddFunc("0 30 * * * *", func() { fmt.Println("Ogni ora e mezza") })
	c.AddFunc("@hourly",      func() { fmt.Println("Ogni ora") })
	c.AddFunc("@every 1h30m", func() { fmt.Println("Ogni ora e mezza") })
	c.Start()
	..
	// Le funzioni sono invocate nel proprio goroutine, in modo asincrono.
	...
	// Le funzioni possono anche essere aggiunte a un Cron in esecuzione
	c.AddFunc("@daily", func() { fmt.Println("Ogni giorno") })
	..
	..
	c.Stop()  // Arresta il pianificatore (non arresta i lavori già in esecuzione).
}

3. Formato dell'espressione CRON

Un'espressione cron rappresenta un insieme di tempi, utilizzando 6 campi separati da spazio.

Nome del campo Obbligatorio? Valori consentiti Caratteri speciali consentiti
Secondi 0-59 * / , -
Minuti 0-59 * / , -
Ore 0-23 * / , -
Giorno del mese 1-31 * / , - ?
Mese 1-12 o GEN-DIC * / , -
Giorno della settimana 0-6 o DOM-SAB * / , - ?

4. Caratteri Speciali nelle Espressioni CRON

  • Asterisco ( * ) L'asterisco rappresenta tutti i valori possibili per il campo dato. Ad esempio, un asterisco nel campo dei minuti significa ogni minuto.
  • Slash ( / ) Il carattere slash è utilizzato per specificare gli incrementi. Ad esempio, "*/15" nel campo dei secondi significa ogni 15 secondi a partire da zero.
  • Virgola ( , ) Il carattere virgola è utilizzato per elencare più valori discreti. Ad esempio, "LUN,MER,VEN" nel campo del giorno della settimana significa che il lavoro verrà eseguito lunedì, mercoledì e venerdì.
  • Trattino ( - ) Il trattino indica un intervallo di valori. "9-17" nel campo delle ore indica ogni ora dalle 9:00 alle 17:00.
  • Punto interrogativo ( ? ) Il punto interrogativo può essere usato nei campi del giorno del mese e del giorno della settimana per significare 'nessun valore specifico', utile quando è necessario specificare un valore per uno e non per l'altro.

5. Pianificazioni Predefinite

Spiegazione dettagliata delle pianificazioni predefinite disponibili, visualizzate in un formato tabellare:

Voce Descrizione Equivalente a
@yearly (o @annually) Esegui una volta all'anno, mezzanotte, 1° gennaio 0 0 0 1 1 *
@monthly Esegui una volta al mese, mezzanotte, primo del mese 0 0 0 1 * *
@weekly Esegui una volta alla settimana, mezzanotte tra sabato/domenica 0 0 0 * * 0
@daily (o @midnight) Esegui una volta al giorno, mezzanotte 0 0 0 * * *
@hourly Esegui una volta all'ora, all'inizio dell'ora 0 0 * * * *

6. Intervalli e pianificazione degli intervalli fissi

La pianificazione dei lavori da eseguire a intervalli fissi è un'altra potente funzionalità della libreria cron. Ad esempio, per pianificare un lavoro che viene eseguito ogni 2 ore:

c.AddFunc("@every 2h", func() { fmt.Println("Il lavoro viene eseguito ogni due ore") })

7. Fusi orari e Pianificazione dei Lavori

L'interpretazione e la pianificazione vengono effettuate nel fuso orario locale della macchina in cui viene eseguita l'applicazione Go. Durante i cambiamenti dell'ora legale, è necessario fare attenzione poiché alcuni orari potrebbero non esistere o essere ripetuti.

8. Sicurezza dei Thread e Sincronizzazione

La libreria cron è progettata per essere sicura per i thread e concorrente. È cruciale per chi chiama mantenere una corretta sequenza di invocazioni dei metodi per evitare le condizioni di gara. Meccanismi di sincronizzazione adeguati devono essere utilizzati quando necessario per garantire che i lavori siano pianificati ed eseguiti correttamente.