[英]zerolog prevents go runtime from "deadlocking" on my machine
我偶然发现了一个非常奇特的案例。 显然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 操场上运行它时,它确实在几秒钟后陷入僵局,但我不确定为什么: https://go.dev/play/p/6rkw0jed-6z
我的 zerolog 版本是 v1.26.0
我怀疑 zerolog 库中的一些副作用会导致这种行为,但无法弄清楚是哪个,也无法弄清楚如何规避它......问题是 - 它使我的程序不安全使用(我正在写一个一段代码大量使用通道,没有这种“安全检查”是非常危险的)。
编辑:
正如评论中正确指出的那样,zerolog 似乎确实打开了另一个没有阻塞的 goroutine。
基本上这意味着我不能依赖运行时的“checkdead”功能,因为我不知道哪个 package 可能有这种副作用(产生 goroutines)。
如果数据不可能发送到通道中,那么从接收方的角度来看,结束程序的安全和正确的方法是什么?
我认为显而易见的答案是超时,但我不知道数据出现需要多长时间 - 但也许这是唯一的方法?
编辑#2
澄清我的问题和动机。 到目前为止,所有评论的语气都是我在问一些愚蠢的事情(无法解决 - 甚至被认为可以解决)。 澄清一下:我不是在问“如何不编写死锁的代码”。 Golang 有一个内置的“检查”来检查代码是否卡住: https://go.googlesource.com/go/+/refs/tags/go1.16.10/src/runtime/proc.go#5038 。 很明显,语言开发人员正在尝试通用解决方案。
显然,实践表明,这种检查可能会被“破坏”。 在这种情况下,由 package 副作用(然后为什么 zerolog 在init
阶段生成任何 goroutines 再次超出我的理解)。 所以我问是否有另一种方法来提出一个可能解释这些额外因素的通用解决方案。
如果您认为不可能有这样的解决方案,那可能是真的,但也许有人有一个想法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.