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