Pregunta:
Está creando una herramienta que maneja múltiples llamadas HTTP en gorutinas concurrentes. Para evitar un escenario de ejecución indefinida, busca una manera de cancelar las gorutinas después de un lapso de tiempo específico.
Solución:
Si bien el enfoque de crear una gorutina para dormir durante un período específico y enviar un mensaje de difusión para cancelar las otras rutinas parece lógico, parece haber un problema con la ejecución de las rutinas en este escenario.
Para abordar este desafío, considere aprovechar el paquete de contexto en Go. Ofrece una forma efectiva de manejar tiempos de espera y cancelación de contexto para gorutinas.
Fragmento de código:
Aquí hay un ejemplo que utiliza el paquete de contexto para la gestión de tiempos de espera de gorutinas:
package main import ( "context" "fmt" "time" ) func test(ctx context.Context) { t := time.Now() select { case <-time.After(1 * time.Second): fmt.Println("overslept") case <-ctx.Done(): fmt.Println("cancelled") } fmt.Println("used:", time.Since(t)) } func main() { ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond) go test(ctx) // cancel context after 30 milliseconds time.Sleep(30 * time.Millisecond) cancel() }
Este código crea un contexto con un tiempo de espera de 50 milisegundos. Luego se lanza una rutina para ejecutar la función de prueba, pasando el contexto. Dentro de la función de prueba, una instrucción de selección espera a que se agote el tiempo de espera o que se cancele el contexto. Después de 30 milisegundos, el contexto se cancela, lo que hace que la rutina finalice y se imprima "cancelada".
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