检测一组goroutine之间的死锁

检测一组goroutine之间的死锁,go,deadlock,Go,Deadlock,当所有goroutine都被卡住时,Golang可以检测死锁。但是有可能检测到一组goroutine是否被卡住了吗?例如,在下面的代码中,goroutine1和goroutine2将处于死锁状态,但程序将继续工作,因为主goroutine没有被卡住。我的问题是如何检测goroutine 1和2作为一个组处于死锁状态,因为组中的所有成员都被卡住了 func main() { ch1 := make(chan int) ch2 := make(chan int) // go

当所有goroutine都被卡住时,Golang可以检测死锁。但是有可能检测到一组goroutine是否被卡住了吗?例如,在下面的代码中,goroutine1和goroutine2将处于死锁状态,但程序将继续工作,因为主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)
    }
}
func main(){
ch1:=制造(成交量)
ch2:=制造(成交量)
//goroutine 1
go func(){

ch1允许您在运行时获得一个完整的goroutine堆栈转储,它将向您显示哪些goroutine被阻止以及为什么被阻止。这并不完全是您所描述的,但它提供了足够的信息,可以查看何时发生部分死锁。它还包括一个专用的块探查器,用于监视被阻止的goroutine。

不,这通常是不可计算的。我不知道有任何静态分析工具可以检测您所展示的这个非常具体的情况。在程序中的任何地方都不可能在通道上有发送而在该通道上没有接收。我非常确定这是的一个特例。也就是说,没有程序化的方法来检测或预测死锁有一点:您如何区分死锁、等待用户输入或其他一些I/O操作?从goroutine的角度来看,就我所知,没有区别。