【问题标题】:Why does dynamic binding affect the body of future?为什么动态绑定会影响未来的身体?
【发布时间】:2015-12-19 22:40:29
【问题描述】:

我正在尝试重现 Chas - http://cemerick.com/2009/11/03/be-mindful-of-clojures-binding/ 描述的动态变量的缺陷。

考虑以下 sn-p:

(def ^:dynamic *dynamic-x* 10)

(defn adder [arg]
  (+ *dynamic-x* arg))

(adder 5) ;; returns 15

(binding [*dynamic-x* 20]
  (adder 5)) ;; returns 25

(binding [*dynamic-x* 20]
  @(future (adder 5))) ;; returns 25 (!)

实际上,我预计第三种情况将返回 15,只要在单独的线程上执行添加并且应该使用 *dynamic-x*(我应该是 10)的当前线程本地值。但是,出乎我意料的是,它返回 25。

我哪里错了?

【问题讨论】:

  • 您能否为该问题提供一个更好的标题?也许像why does a dynamic binding unexpectedly work with a future
  • @cfrick 是的,当然。实际上是在考虑这个:)

标签: clojure future dynamic-variables


【解决方案1】:

future 的设计是将动态绑定传递给将在其中执行未来主体的其他线程(查看future 的源代码,它遵循future-call,它使用了一个函数称为binding-conveyor-fn,它显式复制线程本地绑定)。

这个 IMO 的动机是,当使用 future 时,您希望在同一个“逻辑线程”中运行您的计算,但出于性能原因,您实际上只是在另一个 Java 线程中进行。

我同意它应该被明确记录:)

【讨论】:

  • 注意:Clojure 源代码中的断言自 v1.7.0 起
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-03
  • 2016-10-18
  • 2016-11-15
  • 2013-07-02
相关资源
最近更新 更多