35

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

4

3 回答 3

23

不,即使您有时可能看不到任何麻烦,这也不安全。IIRC, fmt 包试图保持安全,因此可能会发生某种混合,但希望不会出现进程崩溃。

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

使用带有一些小的初始设置的 log 包,可以拥有一个不错的 fmt.Print* 功能子集的安全版本。

于 2013-02-04T20:06:03.373 回答
13

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

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

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

于 2013-02-04T20:03:50.890 回答
11

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

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

像这样的东西将创建一个标准输出记录器,可以安全地从任何 go 例程中使用。

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

于 2017-04-10T15:38:00.487 回答