Interacción de la importación de paquetes de red y la detección de interbloqueo
En un programa Go, si la operación de un canal se bloquea mientras el programa se está ejecutando, el programa eventualmente recibirá un error de "punto muerto". Sin embargo, el comportamiento cambia cuando se importa el paquete net.
El fragmento de código en cuestión:
package main
import (
"fmt"
"net/http"
)
func main() {
var ch = make(chan int)
ch Si el paquete net/http no se importa, el programa sale con un error de "bloqueo". Esto se debe a que la operación del canal (envío a un canal sin búfer) se bloquea para siempre y no se está ejecutando ninguna otra rutina para realizar operaciones asincrónicas que permitirían al detector de interbloqueo identificar el problema.
Sin embargo, cuando la red/http Se importa el paquete, el programa no se bloquea. Esto se debe a que la importación del paquete net inicia el sondeo en segundo plano de Goroutines que desactivan efectivamente el detector de interbloqueo.
El paquete net incluye funcionalidad para administrar conexiones de red y utiliza Goroutines para manejar conexiones de forma asincrónica. Estas rutinas de sondeo en segundo plano siguen ejecutándose incluso si no se está estableciendo o procesando ninguna conexión HTTP, lo que hace que el programa parezca no bloqueante para el detector de interbloqueo. Como resultado, el programa no sale con un error de "punto muerto", a pesar de la operación del canal bloqueado.
Este comportamiento se analizó en la edición de GitHub https://github.com/golang/go/issues /12734.
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