我的程序中有多个goroutine,每个goroutine都调用fmt.Println
而没有任何显式同步。这是安全的(即每条线路是否单独出现而没有数据损坏),或者我是否需要创建另一个带有同步的goroutine来专门处理打印?
答案 0 :(得分:17)
即使你有时候没有遇到任何麻烦,也不会安全。 IIRC,fmt软件包试图保持安全,因此可能会出现某种混合,但希望没有进程崩溃。
这是一个更通用的Go文档规则的实例:除非另有说明或从上下文中显而易见,否则对于并发访问而言并不安全。
使用日志包并进行一些小的初始设置,可以拥有fmt.Print *功能的一个很好的子集的安全版本。
答案 1 :(得分:10)
fmt
所做的一切都可以追溯到w.Write()
here。因为它周围没有锁定,所以一切都回到Write()
的实现。由于仍然没有锁定(对于Stdout at least),因此无法保证您的输出不会混合。
我建议使用全局日志例程。
此外,如果您只想记录数据,请使用log
包,它可以正确锁定对输出的访问。
请参阅implementation以供参考。
答案 2 :(得分:4)
常用方法(fmt.printLine)不安全。但是,有一些方法。
log.Logger是" goroutine safe":https://golang.org/pkg/log/#Logger
这样的东西会创建一个stdout记录器,可以安全地从任何常规程序中使用。
logger := log.New(os.Stdout, "", 0)