Julia并行行为在v0.5.0和v0.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

对于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(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)