将多个goroutine打印到stdout是否安全?

我的程序中有多个goroutine,每个goroutine都进行调用而fmt.Println没有任何显式同步。这样安全吗(即,每行将单独出现而不会破坏数据),还是我需要创建另一个带有同步的goroutine来专门处理打印?


湖上湖
浏览 210回答 3
3回答

婷婷同学_

不,即使您有时可能没有发现任何麻烦,也不安全。IIRC,fmt软件包试图处于安全状态,因此可能会发生某种混合,但希望不会导致进程崩溃。这是更通用的Go文档规则的一个实例:除非另有指定或从上下文中可以明显看出,否则对于并发访问而言,事物并不安全。可以使用带有少量初始设置的日志包来获得fmt.Print *功能的子集的安全版本。

白衣染霜花

一切fmt都回落到这里w.Write()可以看出。因为周围没有锁,所以一切都归结到的实现。由于仍然没有锁定(至少对于Stdout),因此不能保证您的输出不会混合。Write()我建议使用全局日志例程。此外,如果您只想记录数据,请使用该log程序包,该程序包会正确锁定对输出的访问。请参阅实现以供参考。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go