For loop 程序在完成之前退出-for循环中存在并发问题-goroutine不工作
当我尝试同时写作时,我的Go项目中断。 我有一个mapFor loop 程序在完成之前退出-for循环中存在并发问题-goroutine不工作,for-loop,go,concurrency,For Loop,Go,Concurrency,当我尝试同时写作时,我的Go项目中断。 我有一个mapmap[string][]字符串。我想同时写入名为key+“.csv”的文件,并为[]字符串的每个值在文件中写入另一行,其中包含该值 我所做的: for key, val := range varValMap { go writeCsv(key, val) } func writeCsv(variable string, values []string) { fName := variable + ".csv
map[string][]字符串。我想同时写入名为key+“.csv”
的文件,并为[]字符串的每个值
在文件中写入另一行,其中包含该值
我所做的:
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")
}
}
函数为:
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")
}
}
程序结束时,我没有发现任何问题,但没有完整的结果(一些文件被写入,但其中没有任何内容),而且当我从go writeCsv(key,val)
中删除go writeCsv(key,val)
时,go-land中的一切都很好。您不会等待goroutines完成。这意味着一旦for循环完成并启动所有goroutine,程序就会退出。任何仍在运行的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.
}
请在主循环周围显示代码。看起来你不是在等待goroutines退出。我希望看到类似于for循环之后没有代码的情况,这是func main()的结尾。这就是您的问题。您的程序在写入任何内容之前退出。