Ricerca…
Sintassi
- digitare CancelFunc func ()
- func Contesto () Contesto
- func TODO () Contesto
- func WithCancel (parent Context) (ctx Context, annulla CancelFunc)
- func WithDeadline (Parent context, deadline time.Time) (Context, CancelFunc)
- func WithTimeout (Parent context, timeout time.Duration) (Context, CancelFunc)
- func WithValue (contesto padre, interfaccia chiave {}, interfaccia val {})
Osservazioni
Il pacchetto di context
(in Go 1.7) o il pacchetto golang.org/x/net/context
(Pre 1.7) è un'interfaccia per la creazione di contesti che possono essere utilizzati per trasportare valori e scadenze dell'ambito della richiesta tra i confini dell'API e tra i servizi, nonché come una semplice implementazione di detta interfaccia.
a parte: la parola "contesto" viene usata vagamente per riferirsi all'intero albero, o alle singole foglie dell'albero, ad es. il context.Context
attuale. Valori contenuti.
Ad un livello elevato, un contesto è un albero. Le nuove foglie vengono aggiunte all'albero quando vengono costruite (un context.Context
con un valore padre) e le foglie non vengono mai rimosse dall'albero. Qualsiasi contesto ha accesso a tutti i valori sopra di esso (l'accesso ai dati scorre solo verso l'alto), e se qualsiasi contesto viene cancellato i suoi figli vengono anche cancellati (i segnali di annullamento si propagano verso il basso). Il segnale di annullamento è implementato mediante una funzione che restituisce un canale che verrà chiuso (leggibile) quando il contesto viene cancellato; questo rende i contesti un modo molto efficace per implementare la pipeline e il pattern di concorrenza di cancellazione , o timeout.
Per convenzione, le funzioni che prendono un contesto hanno il primo argomento ctx context.Context
. Anche se questa è solo una convenzione, è una che dovrebbe essere seguita poiché molti strumenti di analisi statica cercano specificamente questo argomento. Dal momento che Context è un'interfaccia, è anche possibile trasformare dati contestuali esistenti (i valori che passano attraverso una catena di chiamate di richieste) in un normale contesto di Go e utilizzarli in un modo compatibile con le versioni precedenti implementando solo alcuni metodi. Inoltre, i contesti sono sicuri per l'accesso simultaneo in modo da poterli usare da molte goroutine (indipendentemente dal fatto che siano in esecuzione su thread paralleli o come coroutine concorrenti) senza paura.
Ulteriori letture
Albero del contesto rappresentato come grafico diretto
Un semplice albero di contesto (contenente alcuni valori comuni che potrebbero essere richiesti e inclusi in un contesto) creati dal codice Go come segue:
// Pseudo-Go
ctx := context.WithValue(
context.WithDeadline(
context.WithValue(context.Background(), sidKey, sid),
time.Now().Add(30 * time.Minute),
),
ridKey, rid,
)
trCtx := trace.NewContext(ctx, tr)
logCtx := myRequestLogging.NewContext(ctx, myRequestLogging.NewLogger())
È un albero che può essere rappresentato come un grafico diretto che assomiglia a questo:
Ogni contesto figlio ha accesso ai valori dei suoi contesti genitore, quindi l'accesso ai dati scorre verso l'alto nell'albero (rappresentato dai bordi neri). D'altra parte, i segnali di annullamento viaggiano lungo l'albero (se un contesto viene cancellato, tutti i suoi figli vengono cancellati). Il flusso del segnale di annullamento è rappresentato dai bordi grigi.
Utilizzare un contesto per annullare il lavoro
È possibile utilizzare il passaggio di un contesto con un timeout (o una funzione di annullamento) a una funzione di esecuzione prolungata per annullare il funzionamento di tali funzioni:
ctx, _ := context.WithTimeout(context.Background(), 200*time.Millisecond)
for {
select {
case <-ctx.Done():
return ctx.Err()
default:
// Do an iteration of some long running work here!
}
}