无法找到 go 死锁的原因

无法找到此代码死锁的原因。此处的目的是让工作人员仅在收到信号后才执行例行程序。


如果从代码中删除 signalStream 通道,它可以正常工作。但是当它被引入时,它就会陷入僵局。不确定这是为什么。另外,如果有任何工具可以解释死锁的发生,那将有所帮助。


package main


import (

    "log"

    "sync"

)


const jobs = 10

const workers = 5


var wg sync.WaitGroup


func main() {


    // create channel

    dataStream := make(chan interface{})

    signalStream := make(chan interface{})


    // Generate workers


    for i := 1; i <= workers; i++ {

        wg.Add(1)

        go worker(dataStream, signalStream, i*100)

    }


    // Generate jobs


    for i := 1; i <= jobs; i++ {

        dataStream <- i

    }

    close(dataStream)


    // start consuming data

    close(signalStream)


    wg.Wait()


}


func worker(c <-chan interface{}, s <-chan interface{}, id int) {

    defer wg.Done()

    <-s


    for i := range c {

        log.Printf("routine - %d - %d \n", id, i)

    }


}


心有法竹
浏览 53回答 1
1回答

哆啦的时光机

在一个单独的 gorouine 中生成作业,即将整个jobs循环放入一个 goroutine 中。如果你不这样做,那么dataStream <- i你的程序将永远不会“开始消耗数据”// Generate jobsgo func() {&nbsp; &nbsp; for i := 1; i <= jobs; i++ {&nbsp; &nbsp; &nbsp; &nbsp; dataStream <- i&nbsp; &nbsp; }&nbsp; &nbsp; close(dataStream)}()https://go.dev/play/p/ChlbsJlgwdE
打开App,查看更多内容
随时随地看视频慕课网APP