使用goroutines和channel并行执行函数和死锁错误

时间:2016-05-10 10:22:49

标签: go deadlock channel goroutine

编辑::完整代码here

我有以下代码:

filelistchan := make(chan string)
for _, dir := range tld {
    w.Add(1)
    go GetFileList(dir, filelistchan, w)
}
for ;; {
    file, ok := <- filelistchan
    fmt.Println(ok)
    switch ok {
    case false:
        break
    default:
        fmt.Println(file)
    }
}
w.Wait()

和GetFileList函数是

func GetFileList(dir string, filelistchan chan string, w sync.WaitGroup)  {
    defer fmt.Println("finishing from", dir)
    defer w.Done()
    fmt.Println("Searching in", dir)
    filelist := []string{}
    filepath.Walk(dir, func(path string, f os.FileInfo, err error) error{
    filelist = append(filelist, path)
    return nil
    })

    for _, file := range filelist {
        fmt.Println(file)
        filelistchan <- file
    }
}

我在forloop中并行调用GetFileList函数,以获取其中的文件列表。它工作正常,直到最后一个目录,但是,一旦完成最后一个目录,它会给出错误

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]:

当我打印好的时候,我可以看到,一旦完成工作,就永远不会从goroutine打印出来。我无法弄清楚我在这里做错了什么。我在close(filelistchan)函数中尝试了GetFileList,但在第一个goroutine退出后又出现了另一个错误,即write on closed channelattempting to close a closed channel。有人可以解释,有什么最好的惯用方法来实现这个目的吗?

0 个答案:

没有答案