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

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

WBOY
WBOYnach vorne
2024-02-09 10:39:20787Durchsuche

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)
}
  1. 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
}

#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!

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