如果我有多个常规程序,并且其中有两个或多个决定需要打印出来的东西,那么它们是否可能互相打断?
例如:
package main
import (
"fmt"
)
func main() {
go print()
print()
}
func print() {
for true {
fmt.Print("ABCDEF")
}
}
一个常规例程是否可以开始打印(AB
)和另一个例程中断(ABABCDEF
)和原始完成(ABABCDEFCDEF
)?
我已经尝试自己运行并检查输出,看起来很好,但我怎么能确定?
答案 0 :(得分:4)
是的,这是可能的,尽管GOMAXPROCS = 1你看不到任何东西。它们会在运行更多goroutine,更大的线条和更多线程时出现。写入无缓冲的stderr时更是如此,因为stdout缓冲区足够快地接受短写入以帮助防止交错。
这就是为什么“log”包中的Logger有一个内部互斥和缓冲区,以正确序列化调用。