在< favour = "https://www.surveymonkey.com/r/clojure2024">2024 Clojure状态调查!中分享您的想法。

欢迎!请参阅关于页面以了解更多关于这是如何运作的信息。

0
Clojure

在1.4和最新主分支

user> (defn ten (link: ) 10)

'user/ten

user> (doall (pmap #(with-redefs (link: ten (fn [] %)] (ten)) (range 20 100)))
(20 21 22 23 24 25 34 27 28 29 30 31 32 33 34 35 36 37 38 39 39 35 42 43 44 45 48 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 79 87 88 89 90 91 92 93 94 95 97 92 98 99)
user> (ten)
79

不确定这是否是真的bug,但文档没有提到并发安全性缺失,我的预期是在任何(任意交错)的with-redefs调用序列之后,原始值总会被恢复。

5 答案

0

评论者为:timmc

with-redefs文档(v1.4.0)说:"这些临时更改将在所有线程中可见。"这对我不太安全。

一般来说,对var根绑定所做的更改不是线程安全的。

0

评论者为:bendlas

根据我理解,with-redefs主要用于测试套件中对变量的模拟。当vars默认变为静态后,很多测试套件都在使用绑定进行模拟。也许文档应该补充类似以下内容:在使用此功能时,您必须确保只有一个线程与redef'd vars进行交互。

0

评论者:stu

行为如预期,文档字符串的更改是可以接受的。

0

评论者:jafingerhut

2012年11月25日发布的补丁 clj-1104-doc-unsafety-of-concurrent-with-redefs-v1.txt 更新了 with-redefs 的文档字符串,以使其更清楚地说明并发使用是不安全的。

0
参考:[https://clojure.atlassian.net/browse/CLJ-1104](https://clojure.atlassian.net/browse/CLJ-1104)(由 jawolfe 报告)
...