gpt4 book ai didi

clojure - 应该把Clojure的功能调换掉!应用于幂等?

转载 作者:行者123 更新时间:2023-12-04 14:01:13 24 4
gpt4 key购买 nike

我正在学习 Clojure Koans,我现在正在玩原子。我的问题与 Koans 无关,而是一个笼统的问题。

考虑来自 Koans 的以下(缩短的)示例:

(def atomic-clock (atom 0))

(meditations
(= 1 (do
(swap! atomic-clock inc)
@atomic-clock)))

交换文档!声明它应用于的函数(在这种情况下为 inc)可以被多次调用,因此该函数应该没有副作用。

显然, inc没有副作用,但不是幂等的。这是否意味着上面的断言实际上可能仍然失败? IE。在函数确实被多次调用的情况下,原子的值增加了不止一次?

最佳答案

传递给 swap! 的函数如果有多个线程争用修改 Atom,则可能会被多次调用。然而,只要它没有副作用,只有最终调用的返回才会反射(reflect)在 Atom 的因果历史中。 1

这是一种可能的情况:

  • 线程 1 次尝试 (swap! atomic-clock inc) .
  • 线程 2 尝试相同。
  • 线程 2 设法执行其 swap!第一的。
  • 线程 1 尝试对原子进行比较和交换并失败,因为它的原始值概念现在已经过时了。
  • 线程 1 重试并成功提交。

  • 这里有三个调用 inc , 两个在线程 1 上,一个在线程 2 上。

    事实 inc不是幂等的不是问题。

    1 抽象地考虑; Clojure 实际上并不存储 Atom 的历史信息。

    关于clojure - 应该把Clojure的功能调换掉!应用于幂等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20818180/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com