在使用 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
    

    例子

    我已经在 J​​ulia 0.6.1 上测试了以下代码片段。我还在 SGE 集群 (OGS/GE 2011.11p1) 上使用相同版本对它们进行了测试,方法是将所有 addprocs 替换为 addprocs_sge 并导入 ClusterManagers.jl 。以下代码段有效:
  • usingaddprocs :
    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/

    10-12 18:21