Il ritardo del pacchetto fornisce un modo per eseguire il codice al di fuori dell'ambito di una richiesta utente utilizzando l'API taskqueue.
Per dichiarare una funzione che può essere eseguita in un secondo momento, chiama Func in un contesto di assegnazione di primo livello, passando una chiave di stringa arbitraria e una funzione il cui primo argomento è di tipo contesto.Contesto. La chiave viene utilizzata per cercare la funzione in modo che possa essere richiamata in un secondo momento.
var laterFunc = delay.Func("key", myFunc)
È anche possibile utilizzare un valore letterale di funzione.
var laterFunc = delay.Func("key", func(c context.Context, x string) { // ... })
Per chiamare una funzione, richiama il relativo metodo di chiamata.
laterFunc.Call(c, "something")
Una funzione può essere chiamata un numero qualsiasi di volte. Se la funzione ha argomenti restituiti e l'ultimo è di tipo errore, la funzione potrebbe restituire un errore non nullo per indicare che è necessario riprovare la funzione.
Gli argomenti delle funzioni possono essere di qualsiasi tipo codificabile dal pacchetto gob. Se un argomento è di tipo di interfaccia, è responsabilità del client registrare con il pacchetto gob qualsiasi tipo di concreto può essere trasmesso per quell'argomento; consulta http://golang.org/pkg/gob/#Registrati per i dettagli.
Eventuali errori durante l'inizializzazione o l'esecuzione di una funzione verranno registrati nei log dell'applicazione. I log degli errori che si verificano durante l'inizializzazione verranno associati alla richiesta che ha richiamato il metodo Call.
Lo stato della chiamata di una funzione che non è ancora stata eseguita correttamente viene conservato combinando il nome file in cui è stata dichiarata con la chiave stringa passata alla funzione Func. L'aggiornamento di un'app con chiamate alle funzioni in attesa dovrebbe essere sicuro, purché le funzioni pertinenti abbiano la combinazione (nome file, chiave) conservata. Il nome file viene analizzato in base a queste regole:
- I percorsi nel pacchetto principale sono abbreviati in modo da includere solo il nome del file (github.com/foo/foo.go -> foo.go).
- I percorsi vengono rimossi solo da quelli dei pacchetti (/go/src/github.com/foo/bar.go -> github.com/foo/bar.go)
- Le versioni dei moduli vengono rimosse (/go/pkg/mod/github.com/foo/bar@v0.0.0-20181026220418-f595d03440dc/baz.go -> github.com/foo/bar/baz.go)
Esiste un rischio intrinseco che le chiamate alle funzioni in attesa vadano perse durante un aggiornamento che contiene modifiche di grande entità. Ad esempio, il passaggio dall'utilizzo di GOPATH a go.mod è una modifica di grandi dimensioni che potrebbe inavvertitamente causare la modifica dei percorsi dei file.
Il pacchetto ritardo utilizza l'API Task Queue per creare attività che chiamano il percorso dell'applicazione prenotata "/_ah/queue/go/delay". Questo percorso non deve essere contrassegnato come "login: obbligatorio" in app.yaml; deve essere contrassegnato come "login: admin" o non deve avere limitazioni di accesso.
Funzioni
Intestazioni delle richieste func
func RequestHeaders(c context.Context) (*taskqueue.RequestHeaders, error)
RequestHeaders restituisce le intestazioni delle richieste HTTP speciali della coda di attività per il gestore corrente delle code di attività. Restituisce un errore se la chiamata viene eseguita da un ritardo esterno.Func.
Funzione
type Function struct {
// contains filtered or unexported fields
}
La funzione rappresenta una funzione che può avere una chiamata ritardata.
Func
Func dichiara una nuova funzione. Il secondo argomento deve essere una funzione con un primo argomento di tipo contesto.Contesto. Questa funzione deve essere chiamata al momento dell'inizializzazione del programma. Ciò significa che deve essere chiamata in una dichiarazione della variabile globale o da una funzione init. Questa limitazione è necessaria perché l'istanza che ritarda una chiamata di funzione potrebbe non essere quella che la esegue. Solo il codice eseguito al momento dell'inizializzazione del programma garantisce che sia stato eseguito da un'istanza prima che riceva una richiesta.
funzione (*funzione) Chiamata
La chiamata richiama una funzione ritardata.
err := f.Call(c, ...)
è equivalente a
t, _ := f.Task(...)
_, err := taskqueue.Add(c, t, "")
func (*Funzione) Attività
L'attività crea un'attività che richiama la funzione. I relativi parametri possono essere modificati prima di essere aggiunti a una coda. Gli utenti non devono modificare i campi Percorso o Payload dell'attività restituita.