【问题标题】:Waiting for a task to be completed on remote processor in Julia在 Julia 的远程处理器上等待任务完成
【发布时间】:2015-08-21 14:39:43
【问题描述】:

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

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

上述“有效”,但我如何确定在工作人员收到a 的定义之前不会执行@everywhere 块中的命令?

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

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

【问题讨论】:

标签: parallel-processing julia


【解决方案1】:

你可以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()]]

【讨论】:

  • 这确实实现了目标。但是,如果不需要添加这组额外的获取,就没有更简单的方法吗?我最初认为同步宏会起作用,但实际上我并没有设法让它起作用。也许这只是一个功能请求,需要一种更直接的方式来使用类似同步的宏来完成此任务,如果现在不存在的话。
  • 如果我理解正确,这意味着每个调用都必须同步请求和获取,这使得使用多个进程执行它毫无价值(实际上在单个进程/线程中运行会更好因为你不会花时间在间接费用上)
  • @sync 等待表达式(即@async sendTo(...),其中包括@spawnat)已完成。您正在同步执行循环(永远不会有两个工作人员同时工作)
  • 好的,谢谢!我意识到也许我不应该在 cmets 部分提问(在 Meta 帖子上看到了这个),因此将我的查询移至此页面:stackoverflow.com/questions/37287020/… 我欢迎任何 cmets、更正、建议等。 !
猜你喜欢
  • 1970-01-01
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
  • 2013-09-22
  • 2012-07-23
  • 2015-11-12
  • 1970-01-01
相关资源
最近更新 更多