请考虑以下代码:
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
)。
答案 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发布的代码将会起作用。