我试图找出如何在宏中正确使用 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 有什么问题吗?

最佳答案

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 ) 在另一个宏中创建闭包。推理是很尴尬的。
一般来说,我发现 @spawnatremote_call 更难推理。

它需要是 remotecall_wait 的原因是因为否则,当它的内容运行时没有garentee。这意味着 r 发生了什么本身就不清楚。我觉得它应该是安全的,但似乎不是。
我认为因为等待 r ,而不是等待设置 remotecallr 永远不会肯定允许 remotecall 运行。

综上所述:
  • 更喜欢 remotecall 而不是 @spawnat ,特别是在宏中,为了更容易推理。
  • 有时你必须在 wait 之前对事物进行 fetch。那可能是一个错误
  • 有时会等待 X,当 X 由返回 future Y 的 remotecall (或 @spawnat )设置时,需要先等待 Y。也可能是一个错误
  • 关于parallel-processing - 宏中的 RemoteChannel 正在停止,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39802864/

    10-16 00:18