我试图找出如何在宏中正确使用 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)
不应该是必需的——fetch
在 wait
或 Future
上使用时应该调用 RemoteChannel
。但有时似乎确实如此。
将
@spawnat
更改为 remotecall
意味着您可以传入 r
,没有它,它会得到。我认为带有闭包的宏观卫生嵌套如何用宏创建它们自己是有问题的。 ( @spawnat
) 在另一个宏中创建闭包。推理是很尴尬的。一般来说,我发现
@spawnat
比 remote_call
更难推理。它需要是
remotecall_wait
的原因是因为否则,当它的内容运行时没有garentee。这意味着 r
发生了什么本身就不清楚。我觉得它应该是安全的,但似乎不是。我认为因为等待
r
,而不是等待设置 remotecall
的 r
永远不会肯定允许 remotecall
运行。综上所述:
remotecall
而不是 @spawnat
,特别是在宏中,为了更容易推理。 wait
之前对事物进行 fetch
。那可能是一个错误 remotecall
(或 @spawnat
)设置时,需要先等待 Y。也可能是一个错误 关于parallel-processing - 宏中的 RemoteChannel 正在停止,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39802864/