等待Julia

时间:2015-08-21 14:39:43

标签: parallel-processing julia

在模仿分布式推理的并行应用程序中,我希望有一个“初始化步骤”,其中所有“从属”从“主”接收一些初始信息然后开始他们的任务。

目前我有一个基于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

以上“有效”,但我怎样才能确定@everywhere块中的命令在工人收到a的定义之前没有执行?

Rmk :对于我正在处理的上下文,我想保留两个不同的块,一个用于传播数据,另一个用于处理数据。

其他rmk :道歉,如果这是微不足道的话,我对处理并行问题很陌生(对朱莉娅而言也是新手)

1 个答案:

答案 0 :(得分:5)

您只需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()]]