Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 使用zerolog获取数据竞争条件_Go - Fatal编程技术网

Go 使用zerolog获取数据竞争条件

Go 使用zerolog获取数据竞争条件,go,Go,我使用配置了二极管的zerolog来防止写入标准输出时出现竞争情况。这是我的日志设置: consoleWriter := zerolog.ConsoleWriter{Out: os.Stdout, NoColor: *logNoColor, TimeFormat: *logDateTimeFormat} return diode.NewWriter(consoleWriter, 1000, 10*time.Millisecond, onMissedMessages) 下面我举一个例子: 最后

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

consoleWriter := zerolog.ConsoleWriter{Out: os.Stdout, NoColor: *logNoColor, TimeFormat: *logDateTimeFormat}
return diode.NewWriter(consoleWriter, 1000, 10*time.Millisecond, onMissedMessages)
下面我举一个例子:

最后,我使用从上面(f)返回的writer设置全局记录器:

我有一个shutdownhook(监听CTRL+C),它在被调用时基本上只写一条日志消息,并取消根上下文。我还使用time.after函数在1秒后编写日志消息

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

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

  • 取消上下文将释放绑定到该上下文的资源。例如,如果您有一个带有通道的子上下文并关闭子上下文,则只有该通道将被关闭/释放
  • Stdout、os.Stderr等不是线程安全的,它们上的操作必须由开发人员控制
  • 我可以在没有同步问题的情况下检查多个goroutine中的上下文是否为Done()。但是,我可以也应该只从一个线程的通道读取数据

  • 取消上下文本身不会释放任何资源。Stdout和stderr是线程安全的,但是并发地写入流是没有意义的。上下文和通道可以从多个goroutine安全使用,因为这是它们的主要用途。如果您需要帮助,请展示一个包含比赛位置的实际示例。我读错了吗():取消此上下文会释放与其相关的资源,因此代码应该在此上下文中运行的操作完成后立即调用cancel。这对于文档来说是不精确的。上下文本身没有发布任何内容,但是它通常与一些资源相关联,这通常就是您使用它的原因。是的,您应该尽快从逻辑上取消上下文,而不是取消从您要取消的上下文派生的上下文。如果没有一个简单的例子,你很难知道你实际上在做什么。你甚至还没有展示什么是数据竞争。我重写了我的库,不再获得竞争条件。我还启动了几个goroutine,这些goroutine刚刚登录,没有任何问题。我还没有发现这个问题,但是我有一个更好的方法来完成我想要完成的事情,而不需要获得竞争条件。取消上下文本身不会释放任何资源。Stdout和stderr是线程安全的,但是并发地写入流是没有意义的。上下文和通道可以从多个goroutine安全使用,因为这是它们的主要用途。如果您需要帮助,请展示一个包含比赛位置的实际示例。我读错了吗():取消此上下文会释放与其相关的资源,因此代码应该在此上下文中运行的操作完成后立即调用cancel。这对于文档来说是不精确的。上下文本身没有发布任何内容,但是它通常与一些资源相关联,这通常就是您使用它的原因。是的,您应该尽快从逻辑上取消上下文,而不是取消从您要取消的上下文派生的上下文。如果没有一个简单的例子,你很难知道你实际上在做什么。你甚至还没有展示什么是数据竞争。我重写了我的库,不再获得竞争条件。我还启动了几个goroutine,这些goroutine刚刚登录,没有任何问题。我还没有发现这个问题,但是我有一个更好的方法来完成我想完成的事情,而不需要获得比赛条件。
    log.Logger = zerolog.New(f).With().Timestamp().Logger()