等待任务在 Julia 的远程处理器上完成

Waiting for a task to be completed on remote processor in Julia

在模仿分布式推理的并行应用程序中,我希望有一个 "initialization step",其中所有 "slaves" 从 "master" 接收一些初始信息,然后开始他们的任务。

目前我有一个基于 sendTo 函数的工作实现(代码是在堆栈溢出时 here 找到的)但我认为它不能保证工作人员不会在收到初始对象之前开始其任务。

这是一个粗略的 MWE

function sendTo(p::Int; args...)
    for (nm, val) in args
        @spawnat(p, eval(Main, Expr(:(=), nm, val)))
    end
end

a = 5

addprocs(4)

[sendTo(worker,a=a+randn()) for worker in workers()]

@everywhere begin
    println(a)
end

上面的"works"但是我怎么能确定@everywhere块中的命令在worker收到a的定义之前不会被执行?

Rmk:对于我工作的上下文,我想保留两个不同的块,一个传播数据,一个在数据上做事。

其他 rmk:抱歉,如果这是微不足道的,我对处理并行性很陌生(对 Julia 也很陌生)

您可以 fetch 每个过程的结果。见 example in the docs

function sendTo(p::Int; args...)
    r = []
    for (nm, val) in args
        s = @spawnat(p, eval(Main, Expr(:(=), nm, val)))
        vcat([s],r)
    end
end
#...
[fetch(r) for r in [sendTo(worker,a=a+randn()) for worker in workers()]]