首页 > 解决方案 > 如何向 Julia 的新员工发送一个结构?

问题描述

我已经定义了一个结构,它应该用作不同函数的输入,而这些函数又被不同的工作人员调用。字段值将在函数中更改,因此我无法在函数调用之间构造它们。如何将结构发送给新员工?我已经尝试过@eval @everywhere,也sendto来自ParallelDataTransfer包。


using Distributed
using Parameters

@with_kw struct Test
    path1::String = ""
    path2::String = ""
end

test = Test()
addprocs(2)
@eval @everywhere test = $test

Output:
ERROR: On worker 2:
UndefVarError: Test not defined

using ParallelDataTransfer
sendto(workers(), test=test)

@everywhere print(test)

Output:
ERROR: On worker 2:
UndefVarError: test not defined

我使用 Julia 1.3.1

标签: structparallel-processingjuliadistributed-computing

解决方案


struct我了解您的问题是关于用远程工作人员改变 local s。您不能这样做,但是您可以发送一份新的struct

using Distributed
addprocs(2)
using Parameters
@everywhere using Parameters
@everywhere begin
    @with_kw mutable struct Test
        a::String = ""
        b::String = ""
    end
end

t = Test(a="some")

@everywhere function mutate(t::Test)
    t.b = "newval"
    t
end

fut = @spawnat 2 mutate(t)
newt = fetch(fut)

现在您可以看到 newt 包含 t 的变异副本:

julia> dump(newt)
Test
  a: String "some"
  b: String "newval"

然而,它的价值t仍然是:

julia> dump(t)
Test
  a: String "some"
  b: String ""

但是,如果工作人员位于同一主机上,您可以更改基于位的类型数组。(此示例假设已使用前面的代码添加了工作人员):

using SharedArrays
@everywhere using SharedArrays

sa = SharedArray([1,2,3,4])

@everywhere function mutate(sa::SharedArray)
    sa[myid()] = myid()*100;
    return nothing
end

fetch(@spawnat 2 mutate(sa))

现在让我们看看数组:

julia> display(sa)
4-element SharedArray{Int64,1}:
   1
 200
   3
   4

推荐阅读