Why doesn't the channel take the last declared value?

WBOY
Release: 2024-02-09 09:15:11
forward
1129 people have browsed it

Why doesnt the channel take the last declared value?

In PHP, channel (channel) is an important concept used in concurrent programming. It allows communication and synchronization operations between different goroutines. However, a common question is: "Why doesn't the channel take the last declared value?" This question involves the design principles and usage of channels. When the channel is receiving operations, it will block waiting for the sender to send data. When the sender has finished sending the data, the receiver can continue execution. Therefore, the value of a channel is determined when the sender sends data, not when the receiver receives data. This is to ensure the reliability and consistency of communication. Therefore, even if the last declared value has changed when the receiver receives it, the channel will still assume the value when it was sent. Doing so avoids data inconsistencies and confusion and ensures reliability and accuracy of communications.

Question content

I'm trying to understand the channel. In this code, I declare values ​​from 1 to 10. The final declared value is 10, but when I print it, it always returns the value of the two declarations before before(8) . I would be happy if someone could explain it.

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

}
Copy after login

When I change the declaration to 8, it returns the value of the two previous declarations, which is 6.

Solution

Because you set 3 buffer sizes for the channel!

NOTE: Your example has different output in different operating systems (e.g. I get the Channel value as: 0)

Set time. Hibernate in your code and see what happens. In your 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>
Copy after login

The output is:

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

Note: A better way to understand what is happening in your code is to follow the code step by step.

what happened? See this trace:

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
Copy after login

In the tracking code, when the channel gets tree values ​​8,9,10, the channel is closed, in step 2 something happens:

1 - If goroutine gets all values ​​quickly (channel value is: 0)
2 - If the goroutine is busy (channel value is: 7 or 8 or 9 or 10)

See this question for details: When to use buffered channels And check out this website for better understanding: LINK

The above is the detailed content of Why doesn't the channel take the last declared value?. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!