Buscar..


Sintaxis

  • escriba CancelFunc func ()
  • func fondo () contexto
  • func TODO () Context
  • func WithCancel (Contexto principal) (Contexto ctx, cancelar CancelFunc)
  • func WithDeadline (contexto principal, tiempo límite.Tiempo) (Context, CancelFunc)
  • func WithTimeout (contexto principal, timeout time.Duration) (Context, CancelFunc)
  • func WithValue (contexto principal, interfaz clave {}, interfaz val {})

Observaciones

El paquete de context (en Go 1.7) o el paquete golang.org/x/net/context (Pre 1.7) es una interfaz para crear contextos que se pueden usar para llevar los valores de alcance de la solicitud y los plazos entre los límites de la API y entre los servicios. Como una simple implementación de dicha interfaz.

aparte: la palabra "contexto" se usa para referirse a todo el árbol, oa hojas individuales en el árbol, por ejemplo. El context.Context real. Valores de context.Context .

En un nivel alto, un contexto es un árbol. Las nuevas hojas se agregan al árbol cuando se construyen (un context.Context con un valor padre), y las hojas nunca se eliminan del árbol. Cualquier contexto tiene acceso a todos los valores por encima de él (el acceso a los datos solo fluye hacia arriba), y si se cancela cualquier contexto, sus hijos también se cancelan (las señales de cancelación se propagan hacia abajo). La señal de cancelación se implementa mediante una función que devuelve un canal que se cerrará (legible) cuando se cancele el contexto; esto hace que los contextos sean una forma muy eficiente de implementar el patrón de concurrencia de la tubería y la cancelación , o tiempos de espera.

Por convención, las funciones que toman un contexto tienen el primer argumento ctx context.Context . Si bien esto es solo una convención, debe seguirse ya que muchas herramientas de análisis estático buscan específicamente este argumento. Dado que Context es una interfaz, también es posible convertir los datos existentes de tipo contexto (valores que se transmiten a lo largo de una cadena de llamadas de solicitud) en un contexto normal de Go y usarlos de una manera compatible hacia atrás con solo implementar algunos métodos. Además, los contextos son seguros para el acceso simultáneo, por lo que puedes usarlos desde muchos goroutines (ya sea que se ejecuten en subprocesos paralelos o como corrutines concurrentes) sin temor.

Otras lecturas

Árbol de contexto representado como un gráfico dirigido

Un árbol de contexto simple (que contiene algunos valores comunes que pueden ser objeto de un ámbito de solicitud e incluido en un contexto) construido a partir de un código de Go como el siguiente:

// 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())

Es un árbol que se puede representar como un gráfico dirigido que se ve así:

Contexto representado como una gráfica dirigida

Cada contexto secundario tiene acceso a los valores de sus contextos principales, por lo que el acceso a los datos fluye hacia arriba en el árbol (representado por bordes negros). Las señales de cancelación, por otro lado, viajan por el árbol (si se cancela un contexto, también se cancelan todos sus hijos). El flujo de la señal de cancelación está representado por los bordes grises.

Usando un contexto para cancelar el trabajo

Pasar un contexto con un tiempo de espera (o con una función de cancelación) a una función de ejecución prolongada se puede usar para cancelar que las funciones funcionen:

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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow