Interação de importação de pacote líquido e detecção de deadlock
Em um programa Go, se uma operação de canal for bloqueada enquanto o programa estiver em execução, o programa eventualmente receberá um erro de "impasse". No entanto, o comportamento muda quando o pacote net é importado.
O snippet de código em questão:
package main
import (
"fmt"
"net/http"
)
func main() {
var ch = make(chan int)
ch Se o pacote net/http não for importado, o programa sai com um erro de "deadlock". Isso ocorre porque a operação do canal (envio para um canal sem buffer) é bloqueada para sempre e nenhuma outra goroutine está em execução para realizar operações assíncronas que permitiriam ao detector de deadlock identificar o problema.
No entanto, quando o net/http pacote é importado, o programa não entra em conflito. Isso ocorre porque a importação do pacote net inicia a pesquisa em segundo plano de Goroutines que efetivamente desativam o detector de deadlock.
O pacote net inclui funcionalidade para gerenciar conexões de rede e usa Goroutines para lidar com conexões de forma assíncrona. Essas Goroutines de pesquisa em segundo plano continuam em execução mesmo que nenhuma conexão HTTP esteja sendo estabelecida ou processada no momento, o que faz com que o programa pareça não bloquear o detector de deadlock. Como resultado, o programa não sai com um erro de "impasse", apesar da operação do canal bloqueado.
Esse comportamento foi discutido na edição do GitHub https://github.com/golang/go/issues /12734.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3