Parallel processing 如何在Julia中同时写入数组的多个索引?

Parallel processing 如何在Julia中同时写入数组的多个索引?,parallel-processing,julia,Parallel Processing,Julia,我想在朱莉娅身上看到类似的东西: using Distributed addprocs(4) @everywhere arr = Array{Int}(undef, 10) for i = 1:10 @spawn arr[i] = i end 这样做的正确方法是什么?您有以下方法来并行化流程 线程(需要设置JULIA\u NUM\u Threads系统变量) sharedarray using Distributed, SharedArrays addprocs(4) arr =

我想在朱莉娅身上看到类似的东西:

using Distributed
addprocs(4)

@everywhere arr = Array{Int}(undef, 10)
for i = 1:10
    @spawn arr[i] = i
end

这样做的正确方法是什么?

您有以下方法来并行化流程

  • 线程(需要设置
    JULIA\u NUM\u Threads
    系统变量)

  • sharedarray

    using Distributed, SharedArrays
    addprocs(4)
    arr = SharedVector{Int}(10)
    @sync @distributed for i in 1:10
        arr[i] = i 
    end
    
    请注意,常见的错误是忘记将
    @sync
    放在没有聚合器功能的
    @distributed
    之前(请参见最后一个示例)

  • 聚合分布式计算的结果

    using Distributed
    addprocs(4)
    arr = @distributed (append!) for i in 1:10
        [i]
    end
    

  • sharedarray
    ?这个例子几乎与这个例子相当(向下滚动一点)。谢谢,我还发现在我的代码中,将@spawn改为Threads@spawn效果也一样好。使用线程并行化与使用分布式多处理并行化完全不同。当您更改为
    线程时。@spawn
    第一个沿
    @where
    行的线程已过时,您仍然需要确保
    @spawn
    ed线程已完成其工作。在我的情况下,我不能使用第一个线程,因为我的函数不是线程安全的。我也无法实现我的代码,因为第二个和第三个似乎更像是一个语法糖,而不像其他代码那样平静。然而,我的代码神奇地工作。我将很快打开另一个帖子,问我是否做得很好,请看一看。非常感谢你!!我使用第三个,因为有时
    SharedArrays
    对我来说似乎不稳定。当计算
    [i]
    花费大量时间(例如10毫秒)时,第三种方法是有意义的。
    using Distributed
    addprocs(4)
    arr = @distributed (append!) for i in 1:10
        [i]
    end