多个 Goroutine 打印到标准输出是否安全?

问题描述 投票:0回答:3

我的程序中有多个 goroutine,每个 goroutine 都会调用

fmt.Println
,而无需任何显式同步。这是否安全(即,每一行都会单独显示而不会损坏数据),还是我需要创建另一个具有同步功能的 goroutine 专门处理打印?

concurrency synchronization go goroutine
3个回答
29
投票

不,尽管您有时可能没有观察到任何问题,但它并不安全。 IIRC,fmt 包试图保持安全,因此可能会发生某种混合,但希望不会出现进程崩溃。

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

使用日志包和一些小的初始设置,可以拥有 fmt.Print* 功能的一个很好的子集的安全版本。


20
投票

一切

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

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

此外,如果您只想记录数据,请使用

log
包,它可以正确锁定对输出的访问。 请参阅实现以供参考。


14
投票

常用方法(fmt.printLine)并不安全。不过,还是有方法的。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.