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)
程序完成后没有任何问题可以被我检测到,但是没有完整的结果(有些文件被写入但没有任何内容),当我go从go 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)
| 归档时间: |
|
| 查看次数: |
294 次 |
| 最近记录: |