我有一个简单的 goroutine,它调用一个本地二进制文件 (rsync),它指向一个包含要操作的文件列表的临时文本文件,以及一个目标目录。在例程结束时,我删除了临时文件。这里没有问题。
但在某些情况下需要使用相同的临时文件,当在范围循环中调用两个目标时,例如:
destDirs := []string{"dir1/", "dir2/"}
for _, dest := range destDirs {
go launchRoutine(tempfile.Name(), dest)
}
由于 launchRoutine 可能需要一段时间才能运行,并且由于这是一个网络应用程序,所以等到例程完成是不可取的。
问题是,将 os.Remove(tempfile) 代码放在哪里最好?
选项 1 - 向 launchRoutine 发送 slice 而不是字符串,并在 launchRoutine 中循环它,然后删除文件。
选项 2 - 发送一个 bool 到 launchRoutine 以在范围循环最后一次迭代时删除文件。
选项 3 - 不知道?有什么我没有想到的惯用方法吗?
我采用的解决方案,@RJS 的评论似乎验证了该解决方案:
destDirs := []string{"dir1/", "dir2/"}
for _, dest := range destDirs {
go launchRoutine(tempfile.Name(), dest)
}
os.Remove(tempfile.Name())
谢谢!
最佳答案
前提是我没有误解你的解释:
- 选项 1,根据您所说的,您可能希望保留循环并为每个/dest 维护一个协程。
- 选项 2,不要那样做。如果您尝试在 fork 和主/其他 fork 之间共享信息,您需要使用(同步) WaitGroup 或更好的(同步)条件。如果你在协程中留下一个 for exp {} 等待一些共享资源发生变化,这会占用 cpu 并导致大量的减速。即使您在那里使用 sleep ,它也会以浪费的 CPU 换取浪费的运行时间和缺乏协调。使用 Sync.condition wait() 实际上会暂停例程——允许其他例程代替它运行,而 waitgroup 也是一个非常合理的选择。
也许我误会了,但希望我能提供一些帮助。
关于loops - 完成 2 个 goroutine 后删除文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56799155/