动态变量和 Thread/sleep
Dynamic var and Thread/sleep
根据我在某处读到的内容,如果您将新值绑定到 Clojure 中的动态变量,则该新值仅在该线程中可用。
因此,为了对此进行测试,我创建了以下代码:
(def *dynamic-var* "dynamic var")
(defn run-it []
(future (binding [*dynamic-var* "new-value"] (Thread/sleep 3000) (println *dynamic-var*)))
(future (Thread/sleep 1000) (println *dynamic-var*)))
我的问题是:为什么第一个线程(必须打印 "new-value")从不 运行?它从不将 "new-value" 打印到控制台。
问题是您需要使用元数据将 var 标记为动态:
(def ^:dynamic *dynamic-var* "dynamic var")
(defn run-it []
(future (binding [*dynamic-var* "new-value"] (Thread/sleep 3000) (println *dynamic-var*)))
(future (Thread/sleep 1000) (println *dynamic-var*)))
加上^:dynamic
,当你运行(run-it)
时,它会打印出:
dynamic var
new-value
没有它,您可能会看到打印的警告:
Warning: dynamic-var not declared dynamic and thus is not dynamically rebindable, but its name suggests otherwise. Please either indicate ^:dynamic dynamic-var or change the name.
根据我在某处读到的内容,如果您将新值绑定到 Clojure 中的动态变量,则该新值仅在该线程中可用。
因此,为了对此进行测试,我创建了以下代码:
(def *dynamic-var* "dynamic var")
(defn run-it []
(future (binding [*dynamic-var* "new-value"] (Thread/sleep 3000) (println *dynamic-var*)))
(future (Thread/sleep 1000) (println *dynamic-var*)))
我的问题是:为什么第一个线程(必须打印 "new-value")从不 运行?它从不将 "new-value" 打印到控制台。
问题是您需要使用元数据将 var 标记为动态:
(def ^:dynamic *dynamic-var* "dynamic var")
(defn run-it []
(future (binding [*dynamic-var* "new-value"] (Thread/sleep 3000) (println *dynamic-var*)))
(future (Thread/sleep 1000) (println *dynamic-var*)))
加上^:dynamic
,当你运行(run-it)
时,它会打印出:
dynamic var
new-value
没有它,您可能会看到打印的警告:
Warning: dynamic-var not declared dynamic and thus is not dynamically rebindable, but its name suggests otherwise. Please either indicate ^:dynamic dynamic-var or change the name.