我正在阅读vars上的clojure页面(此处:http://clojure.org/vars),其中指出当var
被标记为动态binding
时,线程是本地的:
默认情况下,Vars是静态的,但是使用元数据定义的Vars的每线程绑定将它们标记为动态可以通过宏绑定建立,并且在线程内它们遵守堆栈规则
稍后:
任何其他线程都无法看到使用绑定创建的绑定。同样,可以为绑定创建绑定,这为嵌套上下文提供了一种在调用堆栈之前与代码进行通信的方法。此功能仅通过设置元数据标签来选择加入:动态为true,如上面的代码块中那样。
所以我决定试试这个:
(def ^:dynamic x 0)
(defn print-x [] (prn x))
(binding [x 100] @(future (print-x)))
我希望看到0
打印,因为将来导致操作在新线程中执行,但我得到的结果是10
。我还注意到binding
文档没有提到线程本地绑定,而有with-bindings
函数(或宏)确实讨论了线程本地绑定并且有一个替代(wonky) ,如果你问我)指定绑定的语法,但这并不是我所期望的。
有什么想法吗?我一定错过了一些明显的东西。
答案 0 :(得分:2)
future
函数会自动将其绑定传递给远程线程。 binding-conveyor-fn
会发生这种情况,类似于bound-fn,您可以在自己的代码中将其用于同一目的。