在模仿分布式推理的并行应用程序中,我希望有一个“初始化步骤”,其中所有“从属”从“主”接收一些初始信息然后开始他们的任务。
目前我有一个基于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 :道歉,如果这是微不足道的话,我对处理并行问题很陌生(对朱莉娅而言也是新手)
答案 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()]]