为了账号安全,请及时绑定邮箱和手机立即绑定

Golang:新手——Master-Worker 并发

Golang:新手——Master-Worker 并发

Go
芜湖不芜 2021-07-08 09:00:25
我在尝试实现这个时遇到了一个问题(所有 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 个工人处理的项目 - 感谢任何指示/帮助。
查看完整描述

2 回答

  • 2 回答
  • 0 关注
  • 319 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号