julia - 包设置不会传播给分布式工作人员

标签 julia include loading distributed

信息:

$ julia --version
julia version 1.6.0
$ lscpu
~/root/MyPackage$ lscpu
Architecture:                    x86_64
CPU op-mode(s):                  32-bit, 64-bit
Byte Order:                      Little Endian
Address sizes:                   39 bits physical, 48 bits virtual
CPU(s):                          4
On-line CPU(s) list:             0-3
Thread(s) per core:              1
Core(s) per socket:              4
Socket(s):                       1
NUMA node(s):                    1
Vendor ID:                       GenuineIntel
CPU family:                      6
Model:                           158
Model name:                      Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz
...

假设我想要以下包结构,并想使用 ReTest 的并行测试(我的问题似乎与代码加载在分布式中的工作方式有关,所以这实际上不是 ReTest 特定的问题)。

| root/
    | MyPackage/
        | Project.toml
        | Manifest.toml
        | src/
            | MyPackage.jl
        | test/
            | runtests.jl
            | MyPackageTests.jl

我按以下方式初始化了这个包:

$ cd root && julia
(...) pkg> generate MyPackage;
$ cd MyPackage && julia
(...) pkg> activate .
(...) pkg> instantiate
(...) pkg> add ReTest InlineTest Distributed;
...

用一些 Julia 代码填充 MyPackage.jlruntests.jlMyPackageTests.jl。 该代码是什么不太重要 - 尽管我遵循 here in ReTest 的指南.

然后设置:

$ julia
(...) pkg> activate .
(...) pkg> instantiate
(MyPackage) pkg> st
     Project MyPackage v0.1.0
      Status `~/root/MyPackage/Project.toml`
  [bd334432] InlineTest v0.2.0
  [e0db7c4e] ReTest v0.3.2
  [8ba89e20] Distributed
julia> LOAD_PATH
3-element Vector{String}:
 "@"        # Should be current active environment for MyPackage
 "@v#.#"    # Should be @v1.6 on my system
 "@stdlib"  # Should be absolute path of current Julia installation's stdlib
julia> # Should this code be in .jl files? Don't think that should matter.
julia> using Distributed
julia> addprocs(2)
julia> @everywhere include("test/MyPackageTests.jl")
ERROR: On worker 2:
LoadError: ArgumentError: Package MyPackage not found in current path:
- Run `import Pkg; Pkg.add("MyPackage")` to install the MyPackage package.

Stacktrace:
 [1] require
   @ ./loading.jl:871
 [2] include
   @ ./client.jl:444
 [3] top-level scope
   @ none:1
 [4] eval
   @ ./boot.jl:360
 [5] #103
   @ /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.6/Distributed/src/process_messages.jl:274
 [6] run_work_thunk
   @ /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.6/Distributed/src/process_messages.jl:63
 [7] run_work_thunk
   @ /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.6/Distributed/src/process_messages.jl:72
 [8] #96
   @ ./task.jl:406
in expression starting at /path/to/root/MyPackage/test/MyPackageTests.jl:1

...and 2 more exceptions.

Stacktrace:
 [1] sync_end(c::Channel{Any})
   @ Base ./task.jl:364
 [2] macro expansion
   @ ./task.jl:383 [inlined]
 [3] remotecall_eval(m::Module, procs::Vector{Int64}, ex::Expr)
   @ Distributed /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.6/Distributed/src/macros.jl:223
 [4] top-level scope
   @ /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.6/Distributed/src/macros.jl:207

我想知道这是为什么。在 GitHub 上我看到 this issue that was supposedly fixed .我可以确认当我运行 那个 示例时,如果 using 语句涉及环境所针对的包,我也会遇到与上述 MyPackage 完全相同的问题。

在提交错误或打开问题之前,我想在这里检查一下,以防这是我的流程问题。如果不是,那么分布式/重新测试显然有问题,我会为那些问题开票。非常感谢任何帮助。

最佳答案

根据@carstenbauer 的说法,默认情况下,事件的 Julia 环境不会自动传播到工作进程。解决这个问题的方法是在调用 addprocs 的参数中设置环境,如下所示:

julia> using Distributed
julia> addprocs(2, exeflags="--project=$(Base.active_project())")
julia> @everywhere include("test/MyPackageTests.jl")
julia> MyPackageTests.runtests()  # runs to completion

我可以确认这适用于 MyPackage 示例以及 one shown in the JuliaLang issue .感谢那些为这个答案做出贡献的人。

关于julia - 包设置不会传播给分布式工作人员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70792051/

相关文章:

c++ - 将文件包含到整个项目中

c++ - 如何在 C++ 程序中包含流程工具?

php - 包含在 PHP 中的路径问题

julia - 如何在 Plots.jl 中设置默认颜色渐变

graph - 如何使用 Julia 图阻止网格自动缩放

mvvm - 围绕 MEF : how to load View(Model)? 缠绕我的思绪

javascript - 如何知道图像是否从用户的网络缓存中提取或如何获得准确的加载时间?

android - 带有加载指示器的 TextInputLayout

ipython - 我在哪里/如何轻松托管交互式 Julia ipython 笔记本?

module - 在 Julia 中创建和使用自定义模块