struct - 如何向 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
解决方案
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
推荐阅读
- java - 在java中实现一个方法来检查正确性
- javascript - 通过父组件将数组从一个组件传递到另一个组件,但它在第一次渲染时不起作用
- c++ - 如何从 C++20 中的范围创建新字符串?
- python-3.x - PhotoImage 无法识别 PNG 图像 - 不断出现以下错误:_tkinter.TclError:无法识别图像文件“MyImage.png”中的数据
- html - 降价中居中的一行python代码
- php - 如何在 wordpress 中添加自定义导航侧边栏
- r - 在 Shiny flexdashboard 中使用 textInput
- python - 弹性搜索行为
- java - 使用 MyBatis XML Mapper 检索数据以在单个查询中填充列表
- java - 无法使用带有 maven 的 JSF 项目连接到 MS SQL