程序在完成之前退出 - goroutine中的并发问题不起作用



当我尝试并发编写时,我的Go项目会中断。

我有一张地图map[string][]strings.我想同时写入文件,这些文件被命名为key + ".csv"并且对于 的每个值[]strings将另一行写入包含该值的文件。

我做了什么:

for key, val := range varValMap {
go writeCsv(key, val)
}

功能是:

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")
}
}

该程序完成时没有我检测到的问题,但没有完整的结果(写入了一些文件,但没有内容),当我从中删除gogo writeCsv(key, val)一切都很好。

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

您可以使用同步。等待组作为等待执行完成的简单方法:

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

并更改writeCsv以通知等待组:

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

最新更新