【问题标题】:Dynamic var and Thread/sleep动态变量和线程/睡眠
【发布时间】:2017-05-08 07:25:57
【问题描述】:

根据我在某处读到的内容,如果您将新值绑定到 Clojure 中的动态 var,则该新值仅在该线程中可用。

所以,为了测试,我创建了以下代码:

(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*)))

我的问题是:为什么第一个线程(必须打印“新值”)从不运行?它从不将“新值”打印到控制台。

【问题讨论】:

    标签: multithreading clojure dynamic-variables


    【解决方案1】:

    问题是您需要使用元数据将 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
    

    如果没有它,您可能会看到打印的警告:

    警告:dynamic-var 未声明为动态的,因此不可动态重新绑定,但其名称暗示了其他情况。请注明 ^:dynamic dynamic-var 或更改名称。

    【讨论】:

    • 谢谢,知道了!我正在从静态类型的 Java 过渡到动态类型的 Clojure。我习惯了 IDE 的支持并犯了很多像这样的错误,因为该工具只是没有警告我。你提到的“警告”实际上并没有出现。谢谢!
    • 不客气!我在 REPL 中运行代码时收到警告,我没有检查它在 REPL 之外运行时是否打印。
    猜你喜欢
    • 2018-08-09
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 2012-08-08
    • 2012-06-21
    相关资源
    最近更新 更多