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.
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