我无法在for循环中同时写文件 - goroutine无法正常工作

Mil*_*jic 0 concurrency for-loop go

当我尝试同时写时,我的Go项目中断了.

我有一张地图map[string][]strings.我想同时写文件,这些文件被命名为key + ".csv"和每个[]strings写入另一行的值到文件中的值.

我做了什么:

for key, val := range varValMap {
        go writeCsv(key, val)
    }
Run Code Online (Sandbox Code Playgroud)

功能是:

func writeCsv(variable string, values []string) {
    fName := variable + ".csv"
    fPath := filepath.Join(xmlFolder, "_varval", fName)
    file, err := os.Create(fPath)
    check(err)
    defer file.Close()
    for _, value := range values {
        fmt.Fprintf(file, value + "\n")
    }
}
Run Code Online (Sandbox Code Playgroud)

程序完成后没有任何问题可以被我检测到,但是没有完整的结果(有些文件被写入但没有任何内容),当我gogo writeCsv(key, val)所有文件中移除时,也很好.

Mar*_*arc 13

你不是在等待你的goroutines完成.这意味着只要你的for循环完成启动所有goroutine,程序就会退出.任何仍在运行的goroutine都会中止.

您可以使用sync.WaitGroup作为等待执行完成的简单方法:

var wg sync.WaitGroup
for key, val := range varValMap {
    wg.Add(1)
    go writeCsv(&wg, key, val)
}
wg.Wait()
Run Code Online (Sandbox Code Playgroud)

并更改您writeCsv的通知等待组:

func writeCsv(wg *sync.WaitGroup, variable string, values []string) {
    defer wg.Done()
    // do everything.
}
Run Code Online (Sandbox Code Playgroud)