使用零日志获取数据竞争条件

问题描述 投票:1回答:1

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

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

我从这里开始跟踪示例:zerolog documentation

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

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

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

当我不按CTRL + C时,应用程序将按预期运行;但是,当我在方法的1秒延迟执行之前按CTRL + C时,我得到了数据争用条件。当我删除日志语句时,问题消失了,使我相信从上方设置二极管并不能帮助防止出现竞争状况。

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

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

我重写了我的库并解决了问题。

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