gpt4 book ai didi

clojure - Clojure STM 中用于银行交易 LOOP 的大型数据结构

转载 作者:行者123 更新时间:2023-12-02 14:40:44 26 4
gpt4 key购买 nike

我是函数式编程和 Clojure 的新手,所以我不太确定在大学项目中该做什么。该项目应展示 Clojure STM 在银行交易(将资金从账户 A 转移到账户 B)方面的优势。所以我打算这样做:

  1. 定义初始数据,例如引用矩阵或更好的东西
  2. 生成要执行的随机操作:[
    随机帐户源 ID(0, N_MAX) ,
    随机帐户目标 ID(0, N_MAX), 随机资金 (0, 1000) ]
  3. 将交易插入数据结构
  4. 同步从源 ID 到目标 ID 的资金转账矩阵中的插入,例如:

    for i=0; i lt N; i++;
    synchronize: transfer (matrix[i].source,matrix[i].dest,matrix[i].money)

我对此不确定,那么,也许:

(defn do-all[]
(dosync
(when (pos? N)
(transfer (get matrix [pos 1], get matrix [pos 2], get matrix [pos 3])))))

最佳答案

用 Ref 表示帐户,即每个帐户的 Ref 并在 dosync 操作中执行汇款操作。还要确保在 dosync 操作中不执行任何副作用操作(除了那些引用之外),因为在更新引用时发生冲突时可能会重试。

更新:如果您的帐户数量是固定的,那么您可以使用向量的 ref,其中向量中的每个 ref 都是一个帐户,并且每个帐户由向量中的索引标识。

例如:

(def total-accounts 100)
(def accounts (vec (map (fn [_] (ref 100)) (range total-accounts))))

如果您必须动态添加新帐户并按名称识别它们,则可以使用 HashMap ,其中键是帐户 ID(唯一值),值是帐户余额的引用。如果您想要执行并发操作以从多个线程添加/删除帐户,则需要将此映射包装在 Ref 中。

关于clojure - Clojure STM 中用于银行交易 LOOP 的大型数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9546683/

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