gpt4 book ai didi

go - Go 内部如何处理 os.Signal channel ?

转载 作者:行者123 更新时间:2023-12-01 19:25:51 26 4
gpt4 key购买 nike

有代码时:

package main

import (
"os"
"os/signal"
)

func main() {
sig := make(chan os.Signal, 1)
signal.Notify(sig)
<-sig
}

运行没有问题,当然,阻塞直到你发送一个中断程序的信号。

但:

package main

func main() {
sig := make(chan int, 1)
<-sig
}

抛出此错误:
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]:
main.main()
/home/user/project/src/main.go:5 +0x4d
exit status 2

虽然我理解为什么要阅读 int channel 导致死锁,我只有一个怀疑
os.Signal不是因为它的 channel 会遭受来自“外部”的写入,因为,
它处理信号,它们来自程序外部。

我的怀疑有点正确吗?如果是这样,运行时如何处理与其他 channel 类型不同的情况?

谢谢!

最佳答案

您遇到了死锁,因为尝试从 channel 接收消息但没有其他运行的 goroutine 不存在发送者。同时调用signal.Notify开始 watchSignalLoop() goroutine 在后台,你可以在这里验证实现细节 https://golang.org/src/os/signal/signal.go .

channel 不关心元素类型,除非你的元素类型大于 64kB(严格来说,还有其他细微差别,请检查实现)。

不要猜测运行时是如何工作的,对其进行研究。例如,您可以查看调用 make(chan int) 时发生的情况。 .你可以做go tool compile -S main.go | grep main.go:line of make chan并检查从运行时包中调用了哪个函数。然后只需跳转到该文件并花时间了解实现。您会看到与其他事物相比, channel 的实现非常简单明了

希望能帮助到你!

关于go - Go 内部如何处理 os.Signal channel ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62351729/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com