Zusammenspiel von Netzpaketimport und Deadlock-Erkennung
Wenn in einem Go-Programm eine Kanaloperation blockiert, während das Programm ausgeführt wird, wird das Programm wird schließlich einen „Deadlock“-Fehler erhalten. Das Verhalten ändert sich jedoch, wenn das Netzpaket importiert wird.
Der betreffende Codeausschnitt:
package main
import (
"fmt"
"net/http"
)
func main() {
var ch = make(chan int)
ch Wenn das net/http-Paket nicht importiert wird, wird das Programm mit einem „Deadlock“-Fehler beendet. Dies liegt daran, dass der Kanalvorgang (Senden an einen ungepufferten Kanal) für immer blockiert und keine andere Goroutine ausgeführt wird, um asynchrone Vorgänge auszuführen, die es dem Deadlock-Detektor ermöglichen würden, das Problem zu identifizieren.
Wenn jedoch das Netz/http Wenn das Paket importiert wird, gerät das Programm nicht in einen Deadlock. Dies liegt daran, dass beim Importieren des Net-Pakets Hintergrundabfragen von Goroutinen gestartet werden, die den Deadlock-Detektor effektiv deaktivieren.
Das Net-Paket enthält Funktionen zum Verwalten von Netzwerkverbindungen und verwendet Goroutinen, um Verbindungen asynchron zu verarbeiten. Diese im Hintergrund abfragenden Goroutinen laufen auch dann weiter, wenn gerade keine HTTP-Verbindung hergestellt oder verarbeitet wird, wodurch das Programm für den Deadlock-Detektor als nicht blockierend erscheint. Infolgedessen wird das Programm trotz des blockierten Kanalvorgangs nicht mit einem „Deadlock“-Fehler beendet.
Dieses Verhalten wurde im GitHub-Problem https://github.com/golang/go/issues besprochen /12734.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3