go - 如果在第一次迭代和第二次迭代之间有一个小时刻

标签 go

在下面的代码中,迭代运行了两次。
是否有可能在第一次迭代和第二次迭代之间的时刻运行“test2 <- true”?
我的意思是,当第一次迭代结束而第二次迭代未开始时,是否有向“test2”发送 true 的更改?

package main

import "log"
import "time"

func main() {
    test := make(chan bool, 1)
    test2 := make(chan bool, 1)

    go func() {
        for {
            select {
            case <-test:
                log.Println("test")
            case <-test2:
                log.Println("test2")
            }
        }
    }()

    test <- true
    time.Sleep(1)
    test2 <- true
    time.Sleep(1)
}

最佳答案

是的。由于您的 channel 已缓冲并且可以保存 1 个值。主执行流程可以继续,而无需您的匿名 goroutine 读取您发送到 test 的值。 channel ,它可以在 test2 上发送一个值在 goroutine 唤醒并读取 test 上的值之前的 channel channel 。

这不太可能发生,因为您有一个 time.Sleep() 调用,通常会为 goroutine 执行提供时间,但是不知道在您的机器非常繁忙的极端情况下会发生什么,因为在(不)幸运的时间或其他您没有想到的事情停电。

如果您的 test channel 是无缓冲的,test <- true语句将阻塞,直到您的 goroutine 收到该值,并且 goroutine 至少不可能从 test2 接收到该值。在从 test 收到任何东西之前 channel 。

关于go - 如果在第一次迭代和第二次迭代之间有一个小时刻,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24973935/

相关文章:

go - golang中参数中的动态结构

go - 我如何在intellij中查看nsq源代码?

string - 使用空接口(interface)更改函数中的 arg

函数参数中的多态性

go - 是否可以在不同的用户下运行 goroutine 或 go 方法?

go - 运行 go mod vendor 更新我的库

go - 通过 GUID 卸载应用程序

go - 在 Go 中实现 io.Writer 接口(interface)

synchronization - 如何将这段代码转换为非阻塞和无锁?

postgresql - 两种不同形式的数据库连接字符串