Heim >Backend-Entwicklung >Golang >Gibt es einen Deadlock, wenn zwei fmt.println in einer Go-Routine verwendet werden?
Führt die Verwendung von zwei fmt.Println()-Druckfunktionen in der Go-Sprache zu einem Deadlock? Dies ist eine häufig gestellte Frage. Beantworten wir sie. Zuerst müssen wir das Konzept des Deadlocks verstehen. Ein Deadlock ist eine Situation, in der zwei oder mehr Prozesse darauf warten, dass der andere abgeschlossen wird, was dazu führt, dass das Programm nicht mehr ausgeführt werden kann. Wenn Sie in der Go-Sprache die Druckfunktion fmt.Println() gleichzeitig in zwei Routinen verwenden, tritt kein Deadlock auf, da die Standardausgabe threadsicher ist. Daher können Sie sicher mehrere fmt.Println()-Funktionen in Ihrer Go-Routine verwenden, ohne sich Gedanken über Deadlock-Probleme machen zu müssen.
Ich versuche, los zu lernen und experimentiere auf dem Spielplatz. Ich habe einen sehr einfachen Code. Ich versuche, Strukturen und Slices zusammen in einer Go-Routine zu verwenden. Ich bin mir nicht sicher, ob ich das in der Produktion verwenden würde, aber es scheint ein wenig daneben zu liegen, also hier:
func main() { routinemsg := make(chan []Person) routinemsg2 := make(chan []Person) // create the person records p1 := newPerson("john doe", 25) p2 := newPerson("dohn joe", 52) p3 := newPerson("bohn joo", 30) // send a slice of Person to the first routine go func() { routinemsg <- []Person{p1, p2} }() // retrieve the slice from the first routine[in the append] // append p3 to the slice retrieved from the first routine // send the new slice to the second routine go func() { routinemsg2 <- append(<-routinemsg, p3) }() // I am able to see the first Println but when I insert the second one I get a deadlock error // also, same error if I use one Println with 2 arguments. fmt.Println(<-routinemsg) fmt.Println(<-routinemsg2) }
Ich habe von Wartegruppen gehört, weiß aber noch nichts davon! Also, sei nett zu mir :d, danke, dass du dir die Zeit genommen hast
routinemsg
上只有一个发送操作,但您有 2 个接收操作:一个在启动的 goroutine 中,另一个在 main
in Goroutine. Der gesendete Wert kann von einem Empfänger nur einmal empfangen werden.
Wenn die gestartete Goroutine zuerst von routinemsg
接收,那么就会出现死锁:main
empfängt, wird sie für immer blockiert.
Wenn main
goroutine 首先接收,那么启动的 goroutine 将永远阻塞(尝试从中接收),因此它永远无法在 routinemsg2
上发送任何内容,因此 main
中从 routinemsg2
der Empfang ebenfalls für immer blockiert: erneuter Deadlock.
Löschen main()
中的 fmt.println(<-routinemsg)
行,然后从 routinemsg2
的最终接收可以(最终)继续并打印包含 p1
、p2
和 phpcnc 的切片phpcnp3:
[{john doe 25} {dohn joe 52} {bohn joo 30}]
Probieren Sie es auf dem Go-Spielplatz aus.
Das obige ist der detaillierte Inhalt vonGibt es einen Deadlock, wenn zwei fmt.println in einer Go-Routine verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!