Parallel processing @everywhere是否不在主机上加载函数?

Parallel processing @everywhere是否不在主机上加载函数?,parallel-processing,julia,Parallel Processing,Julia,我制作了一个模块,在核心数量上有一个if条件。如果芯数大于1,则路线平行;否则,它将按照下面代码中所示的串行路径运行 module mymodule import Pkg using Distributed if nworkers() > 1 @everywhere using Pkg @everywhere Pkg.activate(".") @everywhere Pkg.instantiate() @everywhere using CSV

我制作了一个模块,在核心数量上有一个if条件。如果芯数大于1,则路线平行;否则,它将按照下面代码中所示的串行路径运行

module mymodule

import Pkg

using Distributed

if nworkers() > 1
    @everywhere using Pkg
    @everywhere Pkg.activate(".")
    @everywhere Pkg.instantiate()
    @everywhere using CSV
    @everywhere include("src/myfuncs.jl")

    function func()
        df=CSV.read(file);
        .......
    end

else
    using Pkg
    Pkg.activate(".")
    Pkg.instantiate()
    using CSV
    include("src/myfuncs.jl")
    function func()
        df=CSV.read(file);
        .......
    end
end
end #mymodule
1) 当我实例化一个Julia会话时,例如,
Julia-p8
我得到一个错误,说
error:UndefVarError:CSV not defined
。另一方面,当会话被简单地实例化为
julia
时,没有错误。Project.toml和Master.toml文件比
src
高一级。在使用
@everyone
之前,我是否必须加载主机,例如

include("src/myfuncs.jl")
@everywhere include("src/myfuncs.jl")
2) 此外,我发现当程序执行串行路由时,它找不到
myfunc.jl
文件,因为它已经在
src
文件夹中(查找
src/src/myfunc.jl
),这种行为让我感到困惑

有人能在这里分享他们的想法吗?

@everywhere
在所有工人和主人身上执行。然而:

  • 有时,如果运气不好,并且导入的模块未编译,则可能会发生竞争情况(不总是可复制的,但由StackOverflow上的多个用户报告),因此,最好的办法是始终这样编写代码(请注意,如果集群分布在多个服务器上,这可能不够):

  • Pkg之前使用
    修改代码以运行
    。激活

  • 我不确定您希望通过
    @everywhere Pkg.instantiate()
    实现什么,但可以肯定的是,您现在正在做的事情并不好(您必须确保它不会在群集节点的多个副本中运行)

  • 最后,不需要根据工作人员的数量来分隔代码-请参阅第(1)点中的安全模式


  • 希望有帮助

    你的建议很有帮助。然而,这个问题仍然困扰着我<代码>包括(“myfuncs.jl”)@everywhere include(“src/myfuncs.jl”)-只有这样做才有效,是什么解释了这种行为?这与编译竞争问题完全相同。您希望先编译代码,然后再使用它。在您的问题中,您还为
    myfuncs.jl
    src/myfuncs.jl
    使用了不同的位置-通常情况下,除非您执行从进程的自定义启动或某些进程更改其主文件夹位置(例如通过
    cd
    功能),否则情况不应如此我没有为
    myfuncs.jl
    src/myfuncs.jl
    使用不同的位置。我之所以“被迫”使用它,是因为正如您所提到的,看起来有些进程正在更改其主文件夹位置(我不明白为什么会发生这种情况?),此外,您建议不根据工作人员的数量来分离代码的建议已经实现,现在运行良好。谢谢关于文件夹-除非在启动从属进程之前在主进程上执行
    cd
    ,否则我从未观察到它们发生变化。
    using Distributed
    @everywhere using Distributed
    using CSV
    @everywhere using CSV