【发布时间】:2013-08-27 02:45:43
【问题描述】:
在clojure profiling library 中,有一个原子存储一些分析信息,它被许多函数修改。在 cmets 中,他们断言汇总统计信息(其中一个函数)是出于效率目的最后调用的,但我看不出这是如何在实际代码中执行的。
然后我注意到可以强制执行此操作的一种方式是构建地图的顺序,因此我重新创建了一个更简单的示例来演示。
(defn t []
(let [a (atom {})]
{:b (swap! a #(assoc % :data 'is-here))
:c (keys @a)}))
这里,与注释一致,代码中 :b 或 :c 中的哪一个将决定 a 的值。当然必须有一些排序,但是这种行为是否得到保证?似乎不应该这样,因为无序散列没有排序,这可能对并行性产生不利影响。
【问题讨论】:
-
我发现了别的东西,原来它取决于键的字母顺序,大概是它们以某种方式排序的方式。 IE。如果在 aboce 示例中键是 {:d (swap!...) :a (keys ...)},则行为不同。
-
其实不仅如此,行为很奇怪,我不会依赖它。
-
您指的是 pdata-stats 吗? pdata-stats 的所有参数都不是可变的,因此在该函数中生成映射键的顺序无关紧要。
-
我指的是 pdata-stats,尤其是在“with-pdata”宏中。顺序是相关的,':results (do ~@body)' 有副作用,必须在调用 pdata-stats 之前对其进行评估,否则 'stats' 将是一个空原子。
-
这与 pdata-stats 无关,然后 pdata-stats 获取传入的任何内容并且不取消引用。问题是它的 arg 是首先被取消引用,还是它配置的函数首先在 with-pdata 中被评估。是的,它依赖于评估顺序是一种糟糕的风格(如果不是逻辑错误的话)。
标签: map clojure parallel-processing