这里有一些朱莉娅代码:
addprocs()
@everywhere begin
type Test
values::Array{Any,1}
addValue::Function
function Test()
this = new()
this.values = Any[]
this.addValue = function(v)
push!(this.values,v)
end
return this
end
end
end
@everywhere t = Test()
@everywhere t.addValue(myid())
@spawnat 2 whos()
r = @spawnat 2 t
我相信这段代码在所有进程上定义了一个Test类型,然后在每个进程上创建一个存储在一个名为t的变量中的该类型的实例。此变量是该进程的本地变量。然后,我在每个进程上使用并行运行的一个Test方法来改变Test的本地实例。在行
@spawnat 2 whos()
我们可以看到本地确实已经更新了。但是,在尝试将任何远程变量t提取到RemoteRef时,我收到一个巨大的错误。错误消息非常大,但它让我相信Julia序列化过程无法处理用户定义的类型。任何人都可以提供一些见解吗?谢谢!
Upadate: 一个更简单的例子产生相同的错误:
addprocs()
@everywhere begin
type Test
values::Array{Any,1}
addValue::Function
function Test()
this = new()
this.values = Any[]
this.addValue = function(v)
push!(this.values,v)
end
return this
end
end
end
t = Test()
R = RemoteRef(2)
put!(R,t)
答案 0 :(得分:1)
我不知道为什么尝试fetch
内部带有function
字段的复合对象会导致错误...,无论如何,我鼓励您使用Julia方式创建相同的功能:
首先,您不需要在addValue
类型中包含Test
函数,尝试将数据存储与功能分开:
@everywhere begin
type Test
values::Array{Any,1}
addValue::Function
function Test()
this = new()
this.values = Any[]
return this
end
end
end
@everywhere function addValue(v,t::test)
push!(t.values,v)
end
然后在任何地方初始化t
:
@everywhere t = Test()
并在任何地方变异:
@everywhere addValue(myid(),t)
然后在所需的进程上运行getfield()命令以获取局部变量:
r = @spawnat 3 getfield(Main,:t)
检查结果:
assert(fetch(r).values==[3])
有关如何在进程之间传递变量的更多详细信息,请检查this question。