【发布时间】:2014-10-04 17:56:11
【问题描述】:
我对 Julia 在使用工作进程时加载模块的行为感到困惑。
我需要使用一个相当重的PyPlot 模块,这需要相当长的时间来加载。这个程序:
using PyPlot
pygui(true)
println("Loaded")
在我的笔记本电脑上加载大约需要 11 秒:
% time julia test.jl
INFO: Loading help data...
Loaded
julia test.jl 11,10s user 0,18s system 99% cpu 11,323 total
注意INFO: Loading help data... 行。它似乎是由 PyPlot 模块发出的,因为如果我省略 using PyPlot 行,它就不会出现。
但是,当我运行这个程序时:
using PyPlot
pygui(true)
@everywhere println("Loaded")
我得到了这些结果:
% time julia -p 4 test.jl
INFO: Loading help data...
INFO: Loading help data...
INFO: Loading help data...
INFO: Loading help data...
INFO: Loading help data...
Loaded
From worker 2: Loaded
From worker 5: Loaded
From worker 3: Loaded
From worker 4: Loaded
julia -p 4 test.jl 88,94s user 1,19s system 266% cpu 33,865 total
它不仅运行了惊人的 33 秒(长了三倍!),而且它似乎还在每个工人身上加载 PyPlot 模块!
但我确信,为了让每个工作人员都可以使用模块,它必须是@everywhered!确实,这个简单的程序崩溃了:
module Example
export x
x = 10
end
using Example
@everywhere println("x: $x")
调用:
% julia -p 4 test2.jl
x: 10
exception on 2: exception on exception on exception on 4: 5: 3: ERROR: x not defined
in eval at /usr/bin/../lib/julia/sys.so
ERROR: x not defined
in eval at /usr/bin/../lib/julia/sys.so
ERROR: x not defined
in eval at /usr/bin/../lib/julia/sys.so
ERROR: x not defined
in eval at /usr/bin/../lib/julia/sys.so
那么为什么即使我没有请求PyPlot 模块也会加载到所有工作人员身上?
更有趣的是,有一个解决方法:
using PyPlot
pygui(true)
addprocs(4)
@everywhere println("Loaded")
当我用julia test.jl 运行这个程序时,我得到了 15 秒:
% time julia test.jl
INFO: Loading help data...
Loaded
From worker 2: Loaded
From worker 4: Loaded
From worker 5: Loaded
From worker 3: Loaded
julia test.jl 21,98s user 0,46s system 143% cpu 15,678 total
这正是我对使用julia -p 4 test.jl 运行的原始版本所期望的。但我不喜欢这种解决方法,因为它强制我的程序使用addprocs()。
当 Julia 以 -p X 参数启动时,有没有办法限制模块加载到主进程?
【问题讨论】:
标签: parallel-processing multiprocessing julia