【发布时间】:2013-12-09 01:20:52
【问题描述】:
我在尝试实现这一点时遇到了问题(所有 goroutines 都睡着了 - 死锁!) 这是代码的要点:
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 个工人处理的项目 - 感谢任何指针/帮助。
【问题讨论】:
-
如果其他 goroutine 将在通道上写入或读取,您无法关闭通道。一旦关闭,它就对所有人关闭。您需要另一种机制来跟踪您的活动 goroutine,例如,
sync.WaitGroup,通过通道发送特殊值,使用另一个通道作为控制通道(通过它发送“我快死了”)...
标签: go