Warum übernimmt der Kanal nicht den zuletzt deklarierten Wert?

WBOY
Freigeben: 2024-02-09 09:15:11
nach vorne
1130 Leute haben es durchsucht

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

}
Nach dem Login kopieren

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>
Nach dem Login kopieren

Die Ausgabe ist:

1
2
3
4
5
6
7
Channel Value is:  8
9
10
Nach dem Login kopieren

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
Nach dem Login kopieren

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!

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!