Heim  >  Artikel  >  Backend-Entwicklung  >  Goroutine schläft vorzeitig ein

Goroutine schläft vorzeitig ein

PHPz
PHPznach vorne
2024-02-09 11:30:311090Durchsuche

Goroutine 过早进入睡眠状态

php-Editor Banana ist hier, um Ihnen ein häufiges Problem vorzustellen: Goroutine geht vorzeitig in den Ruhezustand. Die Verwendung von Goroutine zum gleichzeitigen Ausführen von Aufgaben in der Go-Sprache ist sehr effizient, aber manchmal kommt es vor, dass Goroutine in den Ruhezustand wechselt, bevor die Aufgabe ausgeführt wird, was dazu führt, dass die Aufgabe nicht normal ausgeführt werden kann. In diesem Artikel wird die Ursache dieses Problems ausführlich erläutert und Lösungen bereitgestellt, die jedem helfen, Goroutine besser zu verstehen und zu verwenden.

Frageninhalt

Code:

package main

import (
    "fmt"
    "time"
)

func main() {
    link := make(chan bool)
    stop := make(chan bool)
    go a(link, stop)
    go b(link)
    <-stop
}

func a(link chan bool, stop chan bool) {
    for i := 0; i < 20; i++ {
        time.Sleep(1 * time.Second)
        link <- true
    }
    stop <- true
}

func b(link chan bool) {
    go func() {
        <-link
        fmt.Println("A")
    }()
    go func() {
        <-link
        fmt.Println("B")
    }()
}

Dieser Code macht nichts Besonderes, ich möchte nur Kanäle und Goroutinen verstehen. Aber etwas ist schiefgegangen und die Coroutine ging nach zweimaliger Schleife in den Ruhezustand und die App stürzte ab.

Lassen Sie uns analysieren, was es tut – jede Sekunde wird eine Nachricht an link。函数 b 在两个地方接收它,因此调用了 print a und b gesendet. Grundsätzlich sollten also jede Sekunde a und b in der Konsole erscheinen. Aber aus mir unbekannten Gründen passiert das nicht, das Programm gibt einmal a und b aus und stürzt dann ab. Ich verstehe das Konzept wahrscheinlich nicht gut genug (Golang ist wirklich nicht intuitiv), daher hoffe ich, dass ich hier die Antwort bekomme.

Workaround

Das Senden an einen ungepufferten Kanal ist nur dann erfolgreich, wenn eine Goroutine Daten von diesem Kanal empfängt. Für die ersten beiden Sendungen gibt es Goroutine-Blöcke von link 通道接收。但是它们收到一个值并终止,并且不再有任何 goroutine 从 link 接收,因此第三个发送到 link. Da keine anderen Goroutinen ausgeführt werden, kommt es zu einem Deadlock des Programms.

Das obige ist der detaillierte Inhalt vonGoroutine schläft vorzeitig ein. 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