我试图找出如何在宏中使用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有什么问题吗?
答案 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)
应该 < - > fetch
在wait
或Future
上使用RemoteChannel
时会被调用@spawnat
。
但有时似乎确实如此。
将remotecall
更改为r
意味着您可以传入@spawnat
,如果没有,则会传递。我认为有些宏观卫生用嵌套创造出来的东西与宏有关。 (@spawnat
)在另一个宏内创建闭包。推理是尴尬的。
一般来说,我发现remote_call
比remotecall_wait
更难以推理。
它需要r
的原因是因为否则,当其内容运行时,没有garentee 。这意味着r
发生的事情本身并不清楚。我觉得它应该是安全的,但似乎不是。
我认为,因为等待remotecall
,而不是等待设置r
的{{1}},所以永远不会确定允许remotecall
运行。
remotecall
至@spawnat
,尤其是在宏中,以便更容易推理。wait
来fetch
之前的事情。这可能是个错误remotecall
(或@spawnat
)返回未来Y设置X时,需要先等待Y.也可能是一个错误