无法在Julia中获取用户定义类型的远程实例

时间:2015-11-03 21:07:54

标签: julia

这里有一些朱莉娅代码:

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)

1 个答案:

答案 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