【问题标题】:clojure per thread binding not working for me每个线程绑定的clojure对我不起作用
【发布时间】: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


    【解决方案1】:

    future 函数将自动将其绑定传递给远程线程。 binding-conveyor-fn 会发生这种情况,它类似于 bound-fn,您可以在自己的代码中将其用于相同的目的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-03
      • 1970-01-01
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-26
      相关资源
      最近更新 更多