等待任务在 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()]]
在模仿分布式推理的并行应用程序中,我希望有一个 "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()]]