繁体   English   中英

zerolog 防止运行时在我的机器上“死锁”

zerolog prevents go runtime from "deadlocking" on my machine

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我偶然发现了一个非常奇特的案例。 显然https://github.com/rs/zerolog可以防止我的程序“死锁”。

这是程序的一个例子:

package main

import (
    "fmt"

    _ "github.com/rs/zerolog/log"
)

func main() {
    ch := make(chan int)
    fmt.Println(<-ch)
}

当我在我的笔记本电脑(go 版本 go1.16.10 linux/amd64)上运行它时,程序并没有结束。 当我尝试在 go playground 上运行它时,它确实在几秒钟后陷入僵局,但我不知道为什么: https : //go.dev/play/p/6rkw0jed-6z

我的 zerolog 版本是 v1.26.0

我怀疑 zerolog 库中的一些副作用会导致这种行为,但无法弄清楚是哪一种,也无法弄清楚如何规避它......问题是 - 它使我的程序使用不安全(我正在编写一个大量使用通道的代码,没有这种“安全检查”是非常危险的)。

编辑

正如评论中正确指出的那样,zerolog 似乎确实打开了另一个没有阻塞的 goroutine。

基本上这意味着我不能依赖运行时的“checkdead”功能,因为我不知道哪个包可能有这种副作用(产生 goroutines)。

如果不可能将数据发送到通道,那么从接收者的角度来看,结束程序的安全和正确的方法是什么?

我认为显而易见的答案是超时,但我不知道数据出现需要多长时间 - 但也许这是唯一的方法?

编辑#2

澄清我的问题和动机。 到目前为止,所有评论的语气都是我在问一些愚蠢的事情(无法解决 - 甚至被认为已解决)。 澄清一下:我不是在问“如何不编写死锁的代码”。 Golang 有一个内置的“检查”来检查代码是否卡住: https ://go.googlesource.com/go/+/refs/tags/go1.16.10/src/runtime/proc.go#5038。 很明显,语言开发人员试图提供通用解决方案。

显然,正如实践所表明的那样,这种检查可能会被“破坏”。 在这种情况下,由于包的副作用(那么为什么 zerolog 在init阶段会产生任何 goroutines 超出了我的理解)。 所以我问有没有另一种方法来提出一个通用的解决方案,可能会考虑到这些额外的因素。

如果您认为不可能有这样的解决方案,那么这可能是真的,但也许有人有想法。

问题暂未有回复.您可以查看右边的相关问题.
1 在Go项目中将Sentry与zerolog一起使用

在布置零日志配置时需要帮助,以在发生异常情况时使用Sentry。 找不到适当的文档 截至目前,我使用此钩子 type RavenHook struct{} func (h RavenHook) Run(e *zerolog.Event, level zerolog.Level, msg strin ...

2 为什么此Go代码陷入僵局?

我是Go的新手,所以任何指针都很棒。 我将如何调试这样的事情? 您可以运行代码段http://play.golang.org/p/SCr8TZXQUE 更新 :这在操场上没有行&lt;-time.After(time.Duration(id)*time.Millisecond) ...

3 将对象记录到以零日志运行的云中

我在Google Cloud Run中的服务尝试使用zerolog记录结构。 该条目未显示在stackdriver日志中。 当我在云运行环境之外的本地计算机上对其进行测试时,它可以正常工作。 这是代码,req是go结构: 堆栈驱动程序日志中的jsonPayload中缺少“ probe_requ ...

4 为什么我的查询陷入僵局?

我正在尝试将一些文件插入到Postgres数据库中。 由于需要大量复制,我们将文件本身放入file表中,然后将它们链接到我们使用output_file表的数据库部分。 由于file表也​​由output_file以外的表引用(例如,类似的input_file表),其中一列是引用计数,当行插入 ...

5 为什么我的频道陷入僵局?

我正在尝试编写一个简单的Go脚本,该脚本计算最多8个自然数的和: 但是,运行该程序将产生以下输出。 为什么我的代码陷入僵局? 我很困惑,因为我正在使用2个独立的通道来计算子和。 这两个渠道之间的关系如何? ...

2012-12-27 06:55:07 3 271   go
6 如何阻止cURL使我的PHP会话死锁?

所以基本上,我使用cURL来调用我无法在PHP中本机实现的API。 当我打电话时,它会使我的PHP会话死锁。 我无法从浏览器中的其他标签连接到我的网站。 如果我删除会话cookie,我可以很好地连接。 之前,当我没有在cURL中超时时,这将无限期地持续下去。 这只是cURL的PHP ...

7 如何从 F# 使用 ZeroLog?

我找不到这方面的任何细节。 这是代码: 它编译但是当我尝试使用 testLogging 它不打印任何东西。 也许我需要配置一些额外的细节,但我不确定是什么。 ...

8 Go Playground 和 Go 在我的机器上的差异?

为了解决我对 goroutines 的一些误解,我去了 Go 游乐场并运行了以下代码: 正如我所预料的,Go playground 返回一个错误:进程花了太长时间。 这似乎意味着在other人中创建的 goroutine 将永远运行。 但是当我在自己的机器上运行相同的代码时,我几乎立即得到了 ...

9 为什么我的事务在MySQL中陷入僵局?

我正在将Spring Data JPA与Hibernate一起使用来创建这样的事务: 在大多数情况下,上面的代码成功了,但我也看到了很多像这样的异常: 这是更新Ping表的唯一位置。 上面的processPing()方法如何可能陷入死锁? 更新: 这是SHOW ...

10 来自2个串行队列的NSManagedObjectContext死锁

我创建了一个系统,在该系统中,我可以根据正在运行的队列从单例对象请求NSManagedObjectContext。 每个串行GCD调度队列都与某个任务相关联,因此获得了自己的上下文,尽管它们都具有相同的持久性存储协调器。 我当时的假设是,这将解决与线程相关的问题,到目前为止看来似乎已经解 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM