@everywhere

时间:2016-10-14 16:33:22

标签: module parallel-processing namespaces julia

请考虑以下代码:

module Mod

    function f()
        @everywhere store(v) = println(12+v)
        g(3,Main.store)
    end

    function g(n,p)
        for i in 1:n
            p(8)
        end
    end

end

Mod.f()

感兴趣的行是g(3,Main.store)。如果不指定模块,则在REPL(w.r.t Main)执行此代码段会产生UnDefVarErrror: store

每个设计是否在当前Module中未评估该行?为什么?序列对应项(没有@everywhere运行正常而未指定Main)。

2 个答案:

答案 0 :(得分:2)

如果我的理解是正确的,@everywhere宏基本上告诉julia在所有进程上执行指令store(v) = println(12+v)(包括主进程,即运行REPL)。换句话说,这发生在全局范围每个进程。因此,有意义的是,在此步骤之后,您可以通过store访问Main.store函数,即在进程的最外层,因为它在当前范围内不存在(即在模块内部/ f功能)。

我假设是"系列对应物"你的意思是直接输入REPL:

function f()
    store(v) = println(12+v)
    g(3, store)
end

function g(n,p)
    for i in 1:n
    p(8)
end

f()

在这种情况下,是的,这是一个完全不同的场景。 store函数现在是f()的本地函数,以及您使用它的地方,因此尝试使用命名空间限定符从其他地方访问它是没有意义的。 / p>

答案 1 :(得分:1)

最近发布的issue解决了我的所有问题。事实证明,我不需要定义闭包store @everywhere。它可以简单地作为remotecall_wait中的数据传递。

换句话说,在using包含模块之前添加其他流程时,Tasos发布的代码将会起作用。