Ändert sich das Verhalten eines Go-Kanals abhängig davon, wie Nachrichten an ihn gesendet werden?

WBOY
Freigeben: 2024-02-09 10:39:20
nach vorne
763 Leute haben es durchsucht

go 通道的行为是否会根据消息发送到它的方式而改变?

php-Editor Xiaoxin In der Go-Sprache ist ein Kanal ein Mechanismus zum Übertragen von Daten zwischen Goroutinen. Das Verhalten eines Kanals hängt davon ab, wie Nachrichten an ihn gesendet werden. Wenn ein Kanal als gepuffert deklariert wird, legt die Goroutine, die die Nachricht sendet, die Nachricht in den Puffer des Kanals und setzt dann die Ausführung fort. Wenn der Kanal als ungepuffert deklariert wird, blockiert die Goroutine, die die Nachricht sendet, bis eine andere Goroutine die Nachricht vom Kanal empfängt. Daher kann man sagen, dass sich das Verhalten eines Kanals abhängig davon ändert, wie Nachrichten an ihn gesendet werden.

Frageninhalt

Warum werden diese beiden Codeteile unterschiedlich ausgeführt?

  1. Das Ausführen des folgenden Codes gibt einen fatal 错误:所有 goroutine 都在休眠 - 死锁!Fehler zurück.
func main() {
    ch := make(chan int)
    ch <- 1
    fmt.println(<-ch)
}
Nach dem Login kopieren
  • Wenn Sie den folgenden Code korrekt ausführen, werden 2 und 3 (jeweils eine Zeile) zurückgegeben.
  • ch := make(chan int)
        go buffer(ch)
        fmt.Println(<-ch)
        fmt.Println(<-ch)
    }
    
    func buffer(ch chan int) {
        ch <- 2
        ch <- 3
    }
    Nach dem Login kopieren

    #1 funktioniert nur dann korrekt, wenn ch als gepufferter Kanal definiert ist. Warum? Warum akzeptiert buffer() in ch 2 Werte, ohne sich zu beschweren?

    Workaround

    Sendevorgänge auf ungepufferten Kanälen werden blockiert, bis eine andere Goroutine Daten daraus liest. Aus diesem Grund kommt es beim ersten Teil des Codes zu einem Deadlock: Wenn Sie an den Kanal senden, liest keine andere Goroutine daraus.

    Im zweiten Fall sendet eine Goroutine zwei Werte an den Kanal und die Haupt-Goroutine liest beim Senden zweimal aus dem Kanal. Der Kanal akzeptiert nicht zwei Sendevorgänge, sondern einen nach dem anderen, wobei der erste Sendevorgang durch den ersten Lesevorgang und der zweite Sendevorgang durch den zweiten Lesevorgang entsperrt wird.

    Das obige ist der detaillierte Inhalt vonÄndert sich das Verhalten eines Go-Kanals abhängig davon, wie Nachrichten an ihn gesendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Verwandte Etiketten:
    Quelle:stackoverflow.com
    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
    Beliebte Tutorials
    Mehr>
    Neueste Downloads
    Mehr>
    Web-Effekte
    Quellcode der Website
    Website-Materialien
    Frontend-Vorlage
    Über uns Haftungsausschluss Sitemap
    Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!