Golang:新手——Master-Worker 并发

我在尝试实现这个时遇到了一个问题(所有 goroutine 都睡着了 - 死锁!)这是代码的要点:


var workers = runtime.NumCPU()


func main() {

    jobs := make(chan *myStruct, workers)

    done := make(chan *myStruct, workers)


    go produceWork(file_with_jobs, jobs)

    for i := 0; i < runtime.NumCPU(); i++ {

        go Worker(jobs, done)

    }

    consumeWork(done)

}


func produceWork(vf string, jobs chan *utils.DigSigEntries) {

    defer close(jobs)


    // load file with jobs

    file, err := ini.LoadFile(vf)


    // get data for processing

    for data, _ := range file {

        // ...

        jobs <- &myStruct{data1, data2, data3, false}

    }

}


func Worker(in, out chan *myStruct) {

    for {

        item, open := <-in

        if !open {

            break

        }


        process(item)

        out <- item

    }

    // close(out)   --> tried closing the out channel, but then not all items are processed

    //                  though no panics occur.

}


func process(item *myStruct) {

    //...modify the item

    item.status = true

}


func consumeWork(done chan *myStruct) {

    for val := range done {

        if !val.status {

            fmt.Println(val)

        }

    }

}

我主要是想了解如何在不使用同步/等待的东西的情况下做到这一点 - 只是纯粹的渠道 - 这可能吗?此例程的目标是让单个生产者加载由 N 个工人处理的项目 - 感谢任何指示/帮助。


芜湖不芜
浏览 320回答 2
2回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go