go - 检测一组 goroutine 之间的死锁

标签 go deadlock

Golang 可以在所有 goroutine 卡住时检测死锁。但是是否可以检测一组 goroutines 是否被卡住了?例如在下面的代码中,goroutine 1 和 2 将处于死锁状态,但程序继续运行,因为主 goroutine 没有卡住。我的问题是如何检测到 goroutine 1 和 2 作为一个组处于死锁状态,因为该组的所有成员都被卡住了?

func main() {
    ch1 := make(chan int)
    ch2 := make(chan int)

    // goroutine 1
    go func() {
        ch1 <- 12
        ch2 <- 13 // oh oh, wrong channel. deadlock between goroutine 1 and 2
    }()

    // goroutine 2
    go func() {
        println(<-ch1)
        println(<-ch1)
    }()

    for {
        // i'm busy
        time.Sleep(time.Second)
    }
}

最佳答案

pprof允许您在运行时获得完整的 goroutine 堆栈转储,这将向您显示哪些 goroutine 被阻止以及原因。这不完全是您所描述的,但它足以了解何时发生部分死锁。它还包括一个专用的 block 分析器,用于监控阻塞的 goroutines。

关于go - 检测一组 goroutine 之间的死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48548928/

相关文章:

Golang libphonenumber

go - 将字符串(键)映射到数字(或任何数据)

windows - 编译Go 1.4.2 报错"dereferencing type-punned pointer"

c# - 死锁还是循环等待?

sql-server - SQL Server Profiler 中的死锁图显示同一聚集键上的相互锁定

regex - 去标志 : trailing slash escapes quote on Windows

Python 线程和锁 : Deadlock

MySQL并发插入导致(显式)事务之外的死锁

resources - 死锁问题(操作系统相关)

go - Fullcalendar 不呈现从 golang gin 获取的事件