宏中的RemoteChannel正在失速

时间:2016-10-01 03:55:05

标签: parallel-processing metaprogramming julia

我试图找出如何在宏中使用RemoteChannel的正确方法。在函数或REPL中,以下代码有效:

addprocs(3)
r = RemoteChannel(3)
@spawnat(3,put!(r,10))
fetch(r) # Gives 10

但是,如果我把相同的东西放在一个宏中:

macro rrtest(src,val)
  quote
    r = RemoteChannel($(esc(src)))
    @spawnat($(esc(src)), put!(r, $(esc(val))))
    println(fetch(r))
  end
end

然后使用相同的参数

调用它
@rrtest(3,10)

然后REPL就停了。使用像这样的RemoteChannels有什么问题吗?

1 个答案:

答案 0 :(得分:2)

macro rrtest(src,val)
     quote
       r = RemoteChannel($(esc(src))) #Using a `Future` here maybe be better
       remotecall_wait(r_i->put!(r_i, $(esc(val))), $(esc(src)), r)
       wait(r);
       println(fetch(r))
     end
   end

wait(r)应该 < - > fetchwaitFuture上使用RemoteChannel时会被调用@spawnat 。 但有时似乎确实如此。

remotecall更改为r意味着您可以传入@spawnat,如果没有,则会传递。我认为有些宏观卫生用嵌套创造出来的东西与宏有关。 (@spawnat)在另一个宏内创建闭包。推理是尴尬的。 一般来说,我发现remote_callremotecall_wait更难以推理。

它需要r的原因是因为否则,当其内容运行时,没有garentee 。这意味着r发生的事情本身并不清楚。我觉得它应该是安全的,但似乎不是。 我认为,因为等待remotecall,而不是等待设置r的{​​{1}},所以永远不会确定允许remotecall运行。

结论:

  • 首选remotecall@spawnat,尤其是在宏中,以便更容易推理。
  • 有时候你需要waitfetch之前的事情。这可能是个错误
  • 有时等待X,当要由remotecall(或@spawnat)返回未来Y设置X时,需要先等待Y.也可能是一个错误