我在尝试实现这个时遇到了一个问题(所有 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
提交
取消