为了账号安全,请及时绑定邮箱和手机立即绑定

在 go 例程中更改目录

在 go 例程中更改目录

Go
慕斯王 2021-11-15 15:30:01
我正在尝试将 go 例程中的目录更改为目录 x。我现在想使用不同的 go 例程将目录更改为目录 y。我的第一个 go 例程的执行会受到第二个 go 例程中当前工作目录的更改的影响吗?想要这样做的目的是在执行类似任务的同时引入并行性。如果它最终改变了 CWD,那么替代方法应该是什么(分叉......)?
查看完整描述

2 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

就像评论中提到的,在每个 goroutine 中跟踪当前工作目录会导致问题。

尝试使用filepath.Abs来捕获绝对目录并将其存储。然后每个 goroutine 可以在它自己的目录上操作,而不必担心它在后台被“切换”。请确保您没有被多个 goroutine 意外修改同一个文件。

编辑:根据@Evan 的评论删除一段文本。使用绝对路径:p


查看完整回答
反对 回复 2021-11-15
?
慕容708150

TA贡献1831条经验 获得超4个赞

在尝试使用“更改工作目录”(CWD)系统调用时发现了一个基本缺陷。

我相信@Evan 是正确的,并且 CWD 是某些操作系统上的线程属性。

正如@Evan 指出的那样,goroutine 可以重新调度(例如在函数调用、通道访问或系统调用中)到不同的线程上。

其含义是,可能无法更改 CWD(如果 Chdir() 可以更改线程 CWD),因为 Go 的运行时选择在不同线程上重新调度 goroutine;它的 CWD 可能会发生无形和不可预测的变化。

编辑:除了更改进程的 CWD 之外,我希望 Chdir() 做任何事情。但是,该软件包的文档没有提及“过程”。

更糟糕的是,运行时可能会改变发布的工作方式。

更糟糕的是,调试起来会非常困难。这可能是一个“海森堡问题”,任何对其进行调试的尝试(例如通过调用一个函数,运行时可能会将其用作重新调度点)实际上可能会以不可预测的方式改变行为。

跟踪绝对路径名。这是明确的、清晰的,甚至可以在不需要同步的情况下跨 goroutine 工作。因此它更简单,更容易测试和调试。


查看完整回答
反对 回复 2021-11-15
  • 2 回答
  • 0 关注
  • 276 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信