Heim >Backend-Entwicklung >Golang >Gibt es einen Deadlock, wenn zwei fmt.println in einer Go-Routine verwendet werden?

Gibt es einen Deadlock, wenn zwei fmt.println in einer Go-Routine verwendet werden?

WBOY
WBOYnach vorne
2024-02-09 10:15:31840Durchsuche

在 go 例程中使用两个 fmt.println 时会出现死锁吗?

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.

Frageninhalt

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

Workaround

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 的最终接收可以(最终)继续并打印包含 p1p2 和 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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen