如何获取Julia的二级工作者的源目录?

时间:2016-06-13 18:59:00

标签: parallel-processing julia

我发现使用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另一个文件最强大的方法是什么?

2 个答案:

答案 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。我将两者留作解决方案。