完成2个goroutine程序后删除文件

时间:2019-06-27 22:35:18

标签: loops go text-files

我有一个简单的goroutine,它调用一个本地二进制文件(rsync),该文件指向一个临时文本文件,该文件包含要操作的文件列表以及目标目录。在例程的最后,我删除了临时文件。这里没有问题。

但是在某些情况下,如果在范围循环中调用了两个目标,则需要使用相同的临时文件,例如:

destDirs := []string{"dir1/", "dir2/"}
for _, dest := range destDirs {
  go launchRoutine(tempfile.Name(), dest)
}

由于launchRoutine可能需要一段时间才能运行,并且由于这是一个Web应用程序,因此无法等待例程完成。

问题是,最好在哪里放置os.Remove(tempfile)代码?

选项1-向launchRoutine发送一个切片而不是一个字符串,然后在launchRoutine中对其进行循环,然后删除该文件。

选项2-当范围循环在最后一次迭代时,将bool发送到launchRoutine以删除文件。

选项3-不知道吗?有我没想到的惯用方式吗?

我使用的解决方案,@ RJS的注释似乎可以验证该解决方案:

destDirs := []string{"dir1/", "dir2/"}
for _, dest := range destDirs {
  go launchRoutine(tempfile.Name(), dest)
}
os.Remove(tempfile.Name())

谢谢!

1 个答案:

答案 0 :(得分:2)

只要我没有误解你的解释:

  • 选项1,根据您所说的,您可能想要保持循环并为每个/目的地维护一个协程。
  • 选项2,请不要这样做。如果您试图在一个fork与主/其他fork之间共享信息,则需要使用(sync。)waitgroup或更好的(sync。)条件。如果您在协程中留下一个for exp {}来等待某些共享资源的更改,这会吃掉cpu并导致大量的速度下降。即使您在那里睡眠,它也要以浪费的cpu权衡浪费的运行时间和缺乏协调性。 Sync.condition wait()的使用实际上会挂起例程-允许其他例程代替它运行,并且waitgroup也是一个非常合理的选择。

也许我误会了,但希望我能有所帮助。