go - goroutine 可以在 fmt.Println 调用期间进入休眠状态吗?

标签 go

我正在做一些调试并且有一些这样的代码:

go func() {
        if !finished {
                fmt.Println("Writing the data")
                writer.Write(data)
        }
}()

finished 变量用于防止写入已关闭的编写器。但是,它没有用。它似乎正在通过标志。我确定对 Println 的调用产生了 goroutine,这可能允许编写器在检查标志之后但在尝试写入之前关闭。果然,删除调用似乎已经解决了它。然而,我想验证,更重要的是征求有关如何正确避免这种情况的建议,而不仅仅是避免在那里打印。

最佳答案

任何 I/O,是的,包括 fmt.Println,都可能导致 goroutine 执行暂停。

但在实践中,这应该无关紧要,因为在任何具有多个 CPU 内核的现代硬件上,即使 goroutine 没有暂停,您也可以体验一场比赛。

您应该始终使您的代码并发安全。

关于go - goroutine 可以在 fmt.Println 调用期间进入休眠状态吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54015990/

相关文章:

testing - 如何在 "Go test"上设置 go timeout 标志

Golang 从串行读取

pointers - 在 Go 中包装指针

go - 使用其他 bool 值进行switch语句

go - 如何处理Go源文件中在函数之外声明的值的错误

go - Golang 什么时候 append() 创建一个新的 slice ?

go - 如何在并发环境中为每个关键参数运行一次 golang 函数调用?

go - 在 func 中定义本地类型和方法?

go - 在Go中将html字符串解析为模板

go - 在 Go 中将数组转换为 slice