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

Tay*_*mon 22 concurrency synchronization go goroutine

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

zzz*_*zzz 18

不,即使你有时候没有发现任何麻烦,也不安全.IIRC,fmt包尝试安全,因此可能会发生某种混合,但希望没有进程崩溃.

这是一个更通用的Go文档规则的实例:除非另有说明或从上下文中显而易见,因此并发访问不安全.

可以使用日志包以及一些小的初始设置来获得fmt.Print*功能的一个很好的子集的安全版本.

  • 这意味着您必须使用想要的 Writer 等设置一个新的记录器实例。有关更多信息,请阅读文档 https://golang.org/pkg/log/#New (3认同)
  • “进行一些小的初始设置”意味着什么? (2认同)

nem*_*emo 11

在这里可以看到一切fmt都回落.因为它周围没有锁定,所以一切都回到了实现.由于仍然没有锁定(至少对于Stdout),因此无法保证您的输出不会混合.w.Write()Write()

我建议使用全局日志例程.

此外,如果您只是想记录数据,请使用log包,它可以正确锁定对输出的访问.请参阅实施以供参考.

  • @ nos,IIUC`write(2)`只是设备驱动程序(或底层软件堆栈)接受的字节数的原子.我的意思是,您可能需要多次调用来编写所有数据,在这种情况下,交错可能会自然发生. (3认同)

del*_*rox 6

常用方法(fmt.printLine)不安全。但是,有一些方法。

log.Logger是“ goroutine安全的”:https ://golang.org/pkg/log/#Logger

这样的事情将创建一个stdout记录器,可以从任何go例程安全地使用它。

logger := log.New(os.Stdout, "", 0)