在例程中更改目录

时间:2015-10-07 20:00:44

标签: go

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

2 个答案:

答案 0 :(得分:3)

如评论中所述,跟踪每个goroutine中的当前工作目录会导致问题。

尝试使用filepath.Abs捕获绝对目录并存储它。然后每个goroutine都可以在它自己的目录上运行,而不用担心它被切换了#34;引擎盖下。请确保您没有被多个goroutine意外修改同一个文件。

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

答案 1 :(得分:0)

@Evan已经发现了尝试使用“更改工作目录”(CWD)系统调用的一个根本缺陷。

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

正如@Evan指出的那样,goroutine可以被重新调整(例如在函数调用,通道访问或系统调用时)到另一个线程上。

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

编辑:我会期望Chdir()除了更改进程的CWD之外还要执行任何操作。但是,该软件包的文档没有提到“进程”。

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

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

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