"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo crear una copia de contexto en la propagación de cancelar?

¿Cómo crear una copia de contexto en la propagación de cancelar?

Publicado el 2025-03-23
Navegar:339

How to Create a Context Copy in Go Without Cancel Propagation?

creando una copia de contexto sin propagación de cancelación en Go

Cuando se trabaja con contextos en GO, puede surgir que necesita crear una copia de un contexto existente que contenga los mismos valores pero se comporta independientemente en términos de cancelación. Este escenario ocurre, por ejemplo, cuando desea realizar una tarea asincrónica después de responder a una solicitud HTTP, que puede sobrevivir al contexto original.

El enfoque convencional implica un seguimiento manual de todos los valores posibles almacenados en el contexto y crear un nuevo contexto para copiar esos valores. Sin embargo, hay una solución más simple y más manejable disponible.

GO 1.21 introdujo la función sincancel en el paquete de contexto. Esta función le permite crear un nuevo contexto que herede todos los valores del contexto original pero es inmune a su cancelación:

import "context"

// WithoutCancel returns a context that is never canceled.
func WithoutCancel(ctx context.Context) context.Context {
    return context.WithValue(context.Background(), context.NoCancel{}, struct{}{})
}

para usar sincancel, simplemente envuelva su contexto original de la siguiente manera:

func Handler(ctx context.Context) (interface{}, error) {
    result := doStuff(ctx)
    newContext := context.WithoutCancel(ctx)
    go func() {
        doSomethingElse(newContext)
    }()
    return result
}

Ahora, la nueva Goroutine funcionará con una copia del contexto original que no se cancelará cuando el contexto original sea. Esto proporciona la flexibilidad y el control necesarios para administrar la vida útil de las tareas asincrónicas.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3