首页 > 解决方案 > 使用 zerolog 获取数据竞争条件

问题描述

我正在使用配置有二极管的 zerolog 来防止写入标准输出时出现竞争情况。这是我的日志设置:

consoleWriter := zerolog.ConsoleWriter{Out: os.Stdout, NoColor: *logNoColor, TimeFormat: *logDateTimeFormat}
return diode.NewWriter(consoleWriter, 1000, 10*time.Millisecond, onMissedMessages)

我正在按照这里的示例进行操作: zerolog 文档

最后,我将全局记录器设置为从上面返回的写入器 (f):

log.Logger = zerolog.New(f).With().Timestamp().Logger()

我有一个关闭挂钩(监听 CTRL+C),它基本上只是在调用它时写入一条日志消息并取消根上下文。我也在使用 time.After 函数在 1 秒后写一条日志消息。

当我不按 CTRL+C 时,应用程序按预期运行;但是,当我在延迟 1 秒的方法执行之前按 CTRL+C 时,我得到一个数据竞争条件。当我删除日志语句时,问题就消失了,导致我相信上面的二极管设置无助于防止竞争条件。

只是为了确保我了解 golang 的工作原理:

  1. 取消上下文会释放与该上下文相关的资源。IE。如果您有一个带有通道的子上下文并关闭子上下文,则只有该通道会被关闭/释放
  2. os.Stdout、os.Stderr 等不是线程安全的,对它们的操作必须由开发人员控制。
  3. 我可以从众多 goroutine 中检查上下文是否为 Done(),而不会出现同步问题。但是,我可以而且应该只能从单个线程的通道中读取

标签: go

解决方案


推荐阅读