我正在编写一个渲染图表的程序。 Todo所以我正在搜索所有文件,并希望将它们调度为异步以便例程并行处理它们。但我认为我误解了渠道的概念。
files := umlFiles("uml") // list of strings
queue := make(chan string)
for i := 0; i < 4; i++ {
go func(queue chan string) {
file, ok := <-queue
if !ok {
return
}
exec.Command("some command", file).Run()
}(queue)
}
for _, f := range files {
queue <- f
}
close(queue)
在完成前4个文件后,它将在死锁中运行,但从不继续使用其余文件。
我可以使用通道将任务分派给运行的例程,并在完成所有任务后停止它们吗?如果是这样,上面的代码出了什么问题?
用来到这里:
how-to-stop-a-goroutine
go-routine-deadlock-with-single-channel
答案 0 :(得分:2)
你非常接近。你遇到的问题是你正在推出4个goroutines,它们都做1件工作,然后返回。试试这个
for i := 0; i < 4; i++ {
go func(queue chan string) {
for file := range queue {
exec.Command("some command", file).Run()
}
}(queue)
}
一旦队列关闭,这些将返回。