Heim  >  Artikel  >  Backend-Entwicklung  >  Warum übernimmt der Kanal nicht den zuletzt deklarierten Wert?

Warum übernimmt der Kanal nicht den zuletzt deklarierten Wert?

WBOY
WBOYnach vorne
2024-02-09 09:15:111148Durchsuche

Warum übernimmt der Kanal nicht den zuletzt deklarierten Wert?

In PHP ist der Kanal ein wichtiges Konzept, das in der gleichzeitigen Programmierung verwendet wird. Es ermöglicht Kommunikations- und Synchronisationsvorgänge zwischen verschiedenen Goroutinen. Eine häufig gestellte Frage lautet jedoch: „Warum übernimmt der Kanal nicht den zuletzt deklarierten Wert?“ Diese Frage betrifft die Designprinzipien und die Verwendung von Kanälen. Wenn der Kanal Vorgänge empfängt, blockiert er das Warten auf das Senden von Daten durch den Absender. Wenn der Sender das Senden der Daten abgeschlossen hat, kann der Empfänger mit der Ausführung fortfahren. Daher wird der Wert eines Kanals bestimmt, wenn der Sender Daten sendet, nicht wenn der Empfänger Daten empfängt. Dadurch soll die Zuverlässigkeit und Konsistenz der Kommunikation gewährleistet werden. Selbst wenn sich der zuletzt deklarierte Wert beim Empfang durch den Empfänger geändert hat, nimmt der Kanal daher immer noch den Wert an, als er gesendet wurde. Dadurch werden Dateninkonsistenzen und Verwirrung vermieden und die Zuverlässigkeit und Genauigkeit der Kommunikation gewährleistet.

Frageninhalt

Ich versuche den Kanal zu verstehen. In diesem Code deklariere ich Werte von 1 bis 10. Der endgültig deklarierte Wert ist 10, aber wenn ich ihn ausdrucke, wird immer der Wert der beiden Deklarationen vor before(8) zurückgegeben. Ich würde mich freuen, wenn es jemand erklären könnte.

func main() {
    channel := make(chan int, 3)
    isOver := make(chan bool)

    go func() {
        for val := range channel {
            fmt.Println(val)
        }
        isOver <- true
    }()

    channel <- 1
    channel <- 2
    channel <- 3
    channel <- 4
    channel <- 5
    channel <- 6
    channel <- 7
    channel <- 8
    channel <- 9
    channel <- 10
    close(channel)

    fmt.Println("Channel Value is: ", <-channel)

    <-isOver

}

Wenn ich die Deklaration auf 8 ändere, wird der Wert der beiden vorherigen Deklarationen zurückgegeben, nämlich 6.

Workaround

Weil Sie 3 Puffergrößen für den Kanal festgelegt haben!

Hinweis: Ihr Beispiel hat in verschiedenen Betriebssystemen eine unterschiedliche Ausgabe (z. B. erhalte ich Channel 值为:0)

Stellen Sie die Zeit ein. Versetzen Sie Ihren Code in den Ruhezustand und sehen Sie, was passiert. In Ihrem Code:

<code>func main() {
    channel := make(chan int)
    isOver := make(chan bool)

    go func() {
        for val := range channel {
            fmt.Println(val)
            // sleep 1 second
            time.Sleep(1 * time.Second)
        }
        isOver <- true
    }()

    channel <- 1
    channel <- 2
    channel <- 3
    channel <- 4
    channel <- 5
    channel <- 6
    channel <- 7
    channel <- 8
    channel <- 9
    channel <- 10
    close(channel)

    fmt.Println("Channel Value is: ", <-channel)
    <-isOver
}

</code>

Die Ausgabe ist:

1
2
3
4
5
6
7
Channel Value is:  8
9
10

Hinweis: Eine bessere Möglichkeit zu verstehen, was in Ihrem Code passiert, besteht darin, ihm Schritt für Schritt zu folgen.

Was ist passiert? Siehe diese Spur:

1 // print 1 and sleep 1s
2,3,4 // stop for get values

3,4 // print 2 and sleep 1
3,4,5 // stop for get value

4,5 // print 3 and sleep 1
4,5,6 // stop for get value

5,6 // print 4 and sleep 1
5,6,7 // stop for get value

6,7 // print 5 and sleep 1
6,7,8 // stop for get value

7,8 // print 6 and sleep 1
7,8,9 // stop for get value

8,9 // print 7 and sleep 1
8,9,10 // stop for get value
// close channel
// in this line get value : fmt.Println("Channel Value is: ", <-channel)

9,10 // before get value
10 // get 9 and sleep 1
// get 10 and sleep 1

// isdone send signal true

Wenn der Kanal im Tracking-Code die Baumwerte 8,9,10 erhält, wird der Kanal geschlossen, in Schritt 2 passiert etwas:

1 – wenn Goroutine alle Werte schnell erhält (Kanalwert ist: 0)
2 – Wenn die Goroutine beschäftigt ist (Kanalwert ist: 7 oder 8 oder 9 oder 10)

Weitere Informationen finden Sie in dieser Frage: Wann sollten gepufferte Kanäle verwendet werden Und schauen Sie sich zum besseren Verständnis diese Website an: LINK

Das obige ist der detaillierte Inhalt vonWarum übernimmt der Kanal nicht den zuletzt deklarierten Wert?. 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