我发现使用Base.source_dir()
超级方便include
文件到Julia脚本,因为使用脚本文件中的相对路径很容易加载所有内容。这对于并行化代码不起作用。例如,如果我们在/Users/username/test/
中有一个名为test.jl
的测试文件,则使用以下代码:
@everywhere println(pwd())
@everywhere println(Base.source_dir())
我们运行julia -p 1 test/test.jl
/Users/username
From worker 2: /Users/username
/Users/username/test
From worker 2: nothing
同样位于include
目录中的test
另一个文件最强大的方法是什么?
答案 0 :(得分:2)
我通常使用这样的东西:
function sendto(p::Int; args...)
for (nm, val) in args
@spawnat(p, eval(Main, Expr(:(=), nm, val)))
end
end
SourceDir = Base.source_dir()
for (idx, pid) in enumerate(workers())
sendto(pid, SourceDir = SourceDir)
end
@everywhere include(string(SourceDir, "/", "FileName"))
请参阅此处(Julia: How to copy data to another processor in Julia)了解sendto()
函数的来源以及许多其他用于在工作人员之间移动数据的有用工具。
答案 1 :(得分:2)
对于这个具体案例,一个不那么普遍但可以说更优雅的解决方案如下:
source_dir = Base.source_dir()
@eval @everywhere include(joinpath($source_dir, "test2.jl"))
由@aireties指出改编自Julia: How to copy data to another processor in Julia。我将两者留作解决方案。