一个以上的goroutine打印到stdout是否安全?

时间:2013-02-04 19:31:14

标签: concurrency synchronization go goroutine

我的程序中有多个goroutine,每个goroutine都调用fmt.Println而没有任何显式同步。这是安全的(即每条线路是否单独出现而没有数据损坏),或者我是否需要创建另一个带有同步的goroutine来专门处理打印?

3 个答案:

答案 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)