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:

Contesto rappresentato come grafico diretto

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!
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow