在使用 addprocs
创建它们后,我试图在我的工作人员中加载一个模块。在顶层调用 addprocs
时,一切正常。但是,当我将代码包装在函数中时,我无法做同样的事情。
就我而言,我正在动态添加工作人员,因此始终在顶层调用 @everywhere using XXX
是不可行的,我需要在函数内部执行此操作。
简而言之,这有效:
addprocs(1)
@everywhere using XXX
而这不会:
function myaddprocs()
addprocs(1)
@everywhere using XXX
end
有任何想法吗?
最佳答案
经过更多的调查,我已经查明了一些使我的代码无法正常工作的问题。
addprocs
之后发生 。如果导入之前发生过,则导入必须以 @everywhere
为前缀。 using
)不起作用,除非包含在 eval
语句中。 对我的代码的修复是:
function myaddprocs()
addprocs(1)
eval(macroexpand(quote @everywhere using XXX end))
end
例子
我已经在 Julia 0.6.1 上测试了以下代码片段。我还在 SGE 集群 (OGS/GE 2011.11p1) 上使用相同版本对它们进行了测试,方法是将所有
addprocs
替换为 addprocs_sge
并导入 ClusterManagers.jl
。以下代码段有效:using
后 addprocs
:addprocs(1)
using SpecialFunctions
pmap(x->SpecialFunctions.sinint(1), workers())
using
前后 addprocs
,第二个 @everywhere
:using SpecialFunctions
addprocs(1)
@everywhere using SpecialFunctions
pmap(x->sinint(1), workers())
using
包裹在 eval
之后的函数内的 addprocs
function getprocs()
addprocs(1)
eval(Expr(:using,:SpecialFunctions))
pmap(x->SpecialFunctions.sinint(1), workers())
end
getprocs()
@everywhere
应用于 eval
function getprocs()
addprocs(1)
@everywhere eval(Expr(:using,:SpecialFunctions))
pmap(x->sinint(1), workers())
end
getprocs()
@everywhere
中使用 eval
代替function getprocs()
addprocs(1)
eval(macroexpand(quote @everywhere using SpecialFunctions end))
pmap(x->sinint(1), workers())
end
getprocs()
另一方面,这些片段不起作用:
using
之前的 addprocs
using SpecialFunctions
addprocs(1)
pmap(x->SpecialFunctions.sinint(1), workers())
using
前后 addprocs
using SpecialFunctions
addprocs(1)
using SpecialFunctions
pmap(x->SpecialFunctions.sinint(1), workers())
using
using SpecialFunctions
function getprocs()
addprocs(1)
@everywhere using SpecialFunctions
pmap(x->sinint(1), workers())
end
getprocs()
using
function getprocs()
addprocs(1)
using SpecialFunctions
pmap(x->SpecialFunctions.sinint(1), workers())
end
getprocs()
关于module - 你如何在 Julia 的函数中加载模块@everywhere,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47685536/