检测一组goroutines之间的死锁

时间:2018-01-31 18:18:41

标签: go deadlock

当所有goroutine卡住时,Golang可以检测到死锁。但有可能检测出一组goroutine是否被卡住?例如,在下面的代码中,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)
    }
}

1 个答案:

答案 0 :(得分:1)

pprof允许您在运行时获取完整的goroutine堆栈转储,这将显示哪些goroutine被阻止以及为什么。这不完全是您描述的内容,但它足以查看何时发生部分死锁。它还包括一个专用的块分析器,用于监视阻塞的goroutines。