loops - 完成 2 个 goroutine 后删除文件

标签 loops go text-files

我有一个简单的 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/

相关文章:

loops - 对 Common LISP `loop for var =` 语法感到困惑

戈朗 sFTP SSH : Authentification Failed

c++ - 如何从 .t​​xt 文件中读取以确定二维数组的大小?

javascript - 使用 settimeout 和 for 循环进行延迟

javascript - 如果另一个数组元素比它长,则替换该数组元素

python - 热 python 输入循环

excel - 如果您在 Windows 资源管理器中右键单击并使用 Excel 打开,如何在 Excel 中打开 txt 文件?

go - 当我的值为结构类型时如何填充 map[string] interface{}?

docker - 将框架 Gin 切换到 Echo 后,服务器不再响应

java - 处理大型文本文件的有效方法是什么?