Julia并行行为在v0.5.0和v0.6.0中不同?
对于Julia 0.5.0和0.6.0,我在下面的相同代码中得到了不同的行为Julia并行行为在v0.5.0和v0.6.0中不同?,julia,Julia,对于Julia 0.5.0和0.6.0,我在下面的相同代码中得到了不同的行为 workspace() rmprocs(workers()) addprocs(2) r = @spawnat workers()[2] @eval a=20000 println(fetch(r)) # prints 20000 as expected a = 1 # assign value to a in process 1 r = @spawnat workers()[2] @eval a println
workspace()
rmprocs(workers())
addprocs(2)
r = @spawnat workers()[2] @eval a=20000
println(fetch(r)) # prints 20000 as expected
a = 1 # assign value to a in process 1
r = @spawnat workers()[2] @eval a
println(fetch(r)) # prints 20000 as expected
r = @spawnat(workers()[2], getfield(Main, :a))
println(fetch(r)) # prints 20000 as expected, equivalent to previous fetch
@sync @spawnat workers()[2] println(a) # prints 1 as expected
r = @sync @spawnat workers()[1] @eval a=10000 # define variable a on workers()[1]
@everywhere println(a) # different results on v0.5.0 and v0.6.0
区别如下所示-即,workers()[2]
从进程1获取一个值a
,该值从未显式分配给它。0.5.0代码的工作方式与我预期的一样,而0.6.0则不然。你知道这是怎么回事吗?还是我不明白
v0.5 v0.6
WARNING: rmprocs: process 1 not removed | WARNING: rmprocs: process 1 not removed
20000 | 20000
20000 | 20000
20000 | 20000
From worker 3: 1 | From worker 3: 1
1 | 1
From worker 2: 10000 | From worker 2: 10000
From worker 3: 20000 | From worker 3: 1
我认为这与未来有关 全局常量(在模块Main中)也在远程节点上声明为常量。如果我在上述代码中使用了let语句,如下所示:
let a=a
@sync @spawnat workers()[2] println(a) # prints 1 as expected
end
然后,0.5.0和0.6.0会产生与我之前发布的代码片段最后一行的
@everywhere println(a)
相同的结果。我可能需要深入研究需要数据传输、在并行进程上初始化变量等的并行代码的通道和未来。@spawnat workers()[2]println(a)#按预期打印1
。为什么要打印1?我怀疑这是因为a
是在进程1上创建的,而println(a)
作为一个整体,只是在workers()[2]
上进行评估。我认为这类似于执行remotecall\u fetch(2,println,a)
。