Julia 如何将参数列表传递给分布式系统中的工人

Julia 如何将参数列表传递给分布式系统中的工人,julia,distributed,Julia,Distributed,对于Julia 1.5.3,我想向分布式工作者传递一个列表或参数 我首先以非分布式方式尝试: using Distributed @everywhere begin using SharedArrays solve(a,b,c) = return (1,2,3) d_rates = LinRange(0.01, 0.33, 5) m_rates = LinRange(0.01, 0.25, 5) population_size = 10^3

对于Julia 1.5.3,我想向分布式工作者传递一个列表或参数

我首先以非分布式方式尝试:

using Distributed

@everywhere begin 
    using SharedArrays

    solve(a,b,c) = return (1,2,3)

    d_rates = LinRange(0.01, 0.33, 5)
    m_rates = LinRange(0.01, 0.25, 5)
    population_size = 10^3
    max_iterations_perloop = 10^3
    nb_repeats = 2

    nb_params = length(d_rates)*length(m_rates)*nb_repeats
    para = enumerate(Base.product(d_rates, m_rates, population_size, max_iterations_perloop, 1:nb_repeats))

    results = SharedArray{Tuple{Int, Int, Int}}(nb_params)
end

for (y , x) in para
    results[y] = solve(x[1], x[2], x[3])
end
效果很好。然后将最终循环更改为:

@sync @distributed for (y , x) in para
    results[y] = solve(x[1], x[2], x[3])
end
然后我得到一个错误(被截断):


是否可以传递这样一个列表,如果可以,如何传递?

我假设您的所有工作人员都在一台服务器上,并且您实际上已经使用
addprocs
命令添加了一些工作人员。代码的第一个问题是在所有Worker上创建
SharedArray
。而
SharedArray
的语法如下:

help?> SharedArray

  SharedArray{T}(dims::NTuple; init=false, pids=Int[])
  SharedArray{T,N}(...)

  Construct a SharedArray of a bits type T and size dims across the processes specified by pids - all of which have to be on the same host. (...)
这意味着您只能从主辅助进程创建一次
SharedArray
,并且可以使用
pids
参数指定知道它的辅助进程(如果您没有指定
pids
所有辅助进程都有权访问)

因此,您的代码将如下所示:

using Distributed, SharedArrays
addprocs(4)
@everywhere using SharedArrays

@everywhere solve(a,b,c) = return (1,2,3)

#(...) # your setup code without @everywhere

results = SharedArray{Tuple{Int, Int, Int}}(nb_params)

@sync @distributed for (y , x) in collect(para)
    results[y] = solve(x[1], x[2], x[3])
end
请注意,您将需要
收集
,因为
@distributed
宏需要知道
向量的大小
,并且它不适合迭代器

using Distributed, SharedArrays
addprocs(4)
@everywhere using SharedArrays

@everywhere solve(a,b,c) = return (1,2,3)

#(...) # your setup code without @everywhere

results = SharedArray{Tuple{Int, Int, Int}}(nb_params)

@sync @distributed for (y , x) in collect(para)
    results[y] = solve(x[1], x[2], x[3])
end