gpt4 book ai didi

clojure - 如何在 Clojure 中取消引用 Future?

转载 作者:行者123 更新时间:2023-12-02 13:50:34 27 4
gpt4 key购买 nike

我的程序的工作原理如下:在一段随机等待时间后,两个 future 将特定金额从一个余额 A 转移到余额 B。每个人重复这样做 10 次。所以我尝试停止程序并取消引用 future ,但它不起作用,它会在我取消引用它时抛出 NullPointerException 。我做错了什么?

我想要一个最终结果,在程序结束前的最后一行显示balanceA和balanceB。现在它确实输出结果,但它出现在“传输”和“尝试”中。我必须做什么?

谢谢。

  (def balanceA (ref 1000))
(def balanceB (ref 2000))
(def agentCount (agent 1))

;;transfer function
(defn transfer [balanceA balanceB amount futureNum waitingTime]
(dosync(alter balanceA - amount))
(Thread/sleep waitingTime)
(dosync(alter balanceB + amount))
(do(
(println "Trying" futureNum waitingTime)
(println "Transfered" futureNum @agentCount)
(send-off agentCount inc))))

;;futureA
(dotimes [n 10](def futureA (future (transfer balanceA balanceB 20 1 (rand-int 100)))))

;;futureB
(dotimes [n 10](def futureB (future (transfer balanceA balanceB 15 2 (rand-int 40))(prn "result" @balanceB @balanceB))))

;;print out the result
(println "result" @balanceA @balanceB)

;;dereference futures
(@futureA)
(@futureB

这是我的输出:

  user=> (load-file "assignment10.clj")
Result: Trying: Trying: 2650 2000
2 Trying: 2 Trying: 2 3
Transfered: 2 1

user=> Trying: 1 28
Transfered: 1 2
Trying: 1 28
Transfered: 1 3
Trying:Trying: 21 2218

Transfered: 2 4
Transfered: 1 4
97

Transfered: 2 6
10
Trying: 2 26
Transfered: 2 7
Transfered: 2 Trying: 8
2Trying:Transfered: 227
2 28
Transfered:7
Transfered: 2 9
2 9
Trying: 2 33
Transfered: 2 12
Trying: 1 49
Trying: 2 39
Transfered:Transfered: 21 1313

Trying: 1 57
Transfered: 1 15
Trying: 1 71
Transfered: 1 16
Trying: 1 76
Transfered: 1 17
Trying: 1 81
Transfered: 1 18
Trying: 1 93
Transfered: 1 19
Trying: 1 98
Transfered: 1 20

最佳答案

有几个地方有一些额外的 (),其中任何一个都可能导致 NullPointerExceptions

(@futureA)

表示首先从 ref 获取当前值,然后获取该值并将其作为函数调用。

(do(
(println "Trying" futureNum waitingTime)
(println "Transfered" futureNum @agentCount)
(send-off agentCount inc))))

do 后面额外的一组 () 导致它调用打印“Trying”的结果作为函数,第一个参数是打印的结果“已转移”和第二个参数是调用发送的结果。 由于 println 总是返回 nil 这将导致 NPE。这些 () 似乎是无意的。

以顶级形式以外的任何方式调用 def 都是不常见的(除非您正在编写宏)。在这种情况下,只有最后一次出现的 futureA 和 futureB 才有用。可能值得考虑使用 for 来代替,然后将所有 future 的结果保存在一个序列中,以便您可以查看其中是否有任何失败,而不是仅仅能够告诉最后一个是否失败。

关于clojure - 如何在 Clojure 中取消引用 Future?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20336397/

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