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

nuv*_*vio 4 clojure stm

我是功能编程和Clojure的新手,所以我不确定如何为大学的项目做些什么.该项目应显示Clojure STM对银行交易的优势(从账户A转账到账户B).所以我打算这样做:

  1. 定义初始数据,如Refs矩阵或更好的东西
  2. 生成执行的随机操作: [ random-account-source-id(0, N_MAX) , random-account-destination-id(0, N_MAX), random-money (0, 1000) ]
  3. 将事务插入数据结构中
  4. 对于矩阵中的所有插入,将资金从source-id转移到destination-id,例如:
    
    for i=0; i lt N; i++;
        synchronize: transfer (matrix[i].source,matrix[i].dest,matrix[i].money)
    
    Run Code Online (Sandbox Code Playgroud)

我不确定这个,然后,也许:

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

Ank*_*kur 6

为每个帐户代表具有Ref即ref的帐户,并在dosync操作中执行汇款操作.还要确保在dosync操作中不进行任何副作用操作(除了那些参考),因为在更新refs时可能会发生冲突时重试.

更新: 如果您将修复帐户数量,则可以使用向量的ref,其中向量中的每个ref都是一个帐户,每个帐户由向量中的索引标识.

例如:

(def total-accounts 100)
(def accounts (vec (map (fn [_] (ref 100)) (range total-accounts))))
Run Code Online (Sandbox Code Playgroud)

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