猿问

在 go 例程中更改目录

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


慕斯王
浏览 277回答 2
2回答

开心每一天1111

就像评论中提到的,在每个 goroutine 中跟踪当前工作目录会导致问题。尝试使用filepath.Abs来捕获绝对目录并将其存储。然后每个 goroutine 可以在它自己的目录上操作,而不必担心它在后台被“切换”。请确保您没有被多个 goroutine 意外修改同一个文件。编辑:根据@Evan 的评论删除一段文本。使用绝对路径:p

慕容708150

在尝试使用“更改工作目录”(CWD)系统调用时发现了一个基本缺陷。我相信@Evan 是正确的,并且 CWD 是某些操作系统上的线程属性。正如@Evan 指出的那样,goroutine 可以重新调度(例如在函数调用、通道访问或系统调用中)到不同的线程上。其含义是,可能无法更改 CWD(如果 Chdir() 可以更改线程 CWD),因为 Go 的运行时选择在不同线程上重新调度 goroutine;它的 CWD 可能会发生无形和不可预测的变化。编辑:除了更改进程的 CWD 之外,我不希望 Chdir() 做任何事情。但是,该软件包的文档没有提及“过程”。更糟糕的是,运行时可能会改变发布的工作方式。更糟糕的是,调试起来会非常困难。这可能是一个“海森堡问题”,任何对其进行调试的尝试(例如通过调用一个函数,运行时可能会将其用作重新调度点)实际上可能会以不可预测的方式改变行为。跟踪绝对路径名。这是明确的、清晰的,甚至可以在不需要同步的情况下跨 goroutine 工作。因此它更简单,更容易测试和调试。
随时随地看视频慕课网APP

相关分类

Go
我要回答