在Julia中获取用户定义类型的远程实例时出现问题

在Julia中获取用户定义类型的远程实例时出现问题,julia,Julia,下面是一些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)

下面是一些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
我相信这段代码在所有进程上定义了一个测试类型,然后在每个进程上创建一个存储在变量t中的该类型的实例。该变量是该过程的局部变量。然后,我使用在每个进程上并行运行的一种测试方法来改变测试的本地实例。排队

@spawnat 2 whos()
我们可以看到,本地的t确实已经更新了。然而,当我试图将任何远程变量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)

我不知道为什么尝试
获取
包含
函数
字段的复合对象会导致错误…,无论如何,我鼓励您使用Julia方法创建相同的功能:

@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
首先,您不需要在
Test
类型中包含
addValue
函数,请尝试将数据存储与功能分开:

@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()

并在任何地方变异t:

@everywhere addValue(myid(),t)

其次,在所需进程上运行getfield()命令以获取局部变量:

r=@spawnat3getfield(Main,:t)

检查结果:

assert(fetch(r).values==[3])


有关如何在进程之间传递变量的更多详细信息,请查看。

谢谢您的回复!我确实遇到了您链接到的问题,如果我按照您的建议分离方法和属性,我似乎可以获取和发送。然而,我使用的def类型不应该是可序列化的,这似乎是一个bug,对吗?一般来说,为什么要将数据存储与功能分开?这似乎与面向对象编程有所不同,朱莉娅应该支持面向对象编程。此外,使用符号或Expr在进程之间传递局部变量似乎很麻烦。您同意吗?据说最新版本(v0.4.1)将解决我的错误:如果它看起来像一只虫子,我同意你的看法。如果您喜欢Julia语言中的OOP方法主题,请查看中的“Julia和面向对象编程”主题