使用通道调度任务进行常规操作

时间:2018-02-11 17:42:12

标签: go goroutine

我正在编写一个渲染图表的程序。 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

1 个答案:

答案 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)
}

一旦队列关闭,这些将返回。