【问题标题】:Avoid messy output when writing to STDOUT from goroutines从 goroutine 写入 STDOUT 时避免混乱的输出
【发布时间】:2013-12-11 12:12:42
【问题描述】:

在写stdout 或日志时,如何确保多个 goroutines 的输出 没有弄乱输出?

例如确保输出是这样的

Routine 1 found 1235 entries
Routine 3 found 999 entries
Routine 2 found 24 entries

不喜欢这样

Routine 1 fouRoutine 3 found 999 entries
nd 1235 entriRoutine 2 found 24 entries
es

我的意思是一个 goroutine 的输出不会与另一个同时写入

即是否有库或标准方法可以在输出周围获取信号量?

【问题讨论】:

    标签: logging go output stdout


    【解决方案1】:

    使用log 包进行日志记录。来自log.Logger

    Logger 表示一个活动的日志对象,它生成输出到 io.Writer 的行。每个日志记录操作都会调用 Writer 的 Write 方法。 一个 Logger 可以同时被多个 goroutine 使用;它保证序列化对 Writer 的访问。

    fmt 包是 generally not safe 与多个 goroutine 一起使用。

    如果关注时间(锁的同步),请在日志语句前添加go

    go log.Println("some log")
    

    但是请注意,日志输出可能(肯定)会延迟。

    【讨论】:

    • 感谢您的快速回答;一个问题“如果时间(锁的同步)值得关注”你是什么意思?例如,什么时候加上 go 有什么关系? (因为日志包本身似乎保证一次只写一个……)
    • @SusanD.Taylor 当使用 log 包的标准日志记录时,会有一个锁阻止多个 goroutine 写入日志。这意味着所有其他 goroutine 在记录时都必须等待。当您过度登录时,这可能是一个瓶颈,但可以通过在新的 goroutine 中运行日志来避免。另一方面,这会导致日志消息是异步的,并且与 goroutine 的实际流程分离。
    • 啊好的,明白了!感谢您花时间解释!
    猜你喜欢
    • 2011-06-28
    • 2018-12-07
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 2012-01-23
    • 2018-10-12
    相关资源
    最近更新 更多