【发布时间】:2014-06-28 14:22:09
【问题描述】:
我正在阅读 vars 上的 clojure 页面(此处:https://clojure.org/reference/vars),其中指出当 var 被标记为动态时,binding 是线程本地的:
默认情况下,Vars 是静态的,但使用元数据定义的 Vars 的每个线程绑定将它们标记为动态可以通过宏绑定和线程内建立它们遵守堆栈规则
稍后:
任何其他线程都无法看到使用绑定创建的绑定。同样,可以分配使用绑定创建的绑定,这为嵌套上下文提供了一种与调用堆栈上的代码进行通信的方法。仅通过将元数据标记 :dynamic 设置为 true 才能选择加入此功能,如上面的代码块中所示。
所以我决定试试这个:
(def ^:dynamic x 0)
(defn print-x [] (prn x))
(binding [x 100] @(future (print-x)))
我希望看到 0 打印出来,因为未来会导致操作在新线程中执行,但我得到的结果是 100。我还注意到binding 文档没有提到线程本地绑定,而有一个with-bindings 函数(或宏)确实讨论了线程本地绑定并且有另一种(如果你问我的话很奇怪)语法用于指定绑定,但这也不符合我的预期。
有什么想法吗?我一定遗漏了一些明显的东西。
【问题讨论】:
标签: clojure