Большая структура данных в Clojure STM для банковских операций LOOP - PullRequest
4 голосов
/ 03 марта 2012

Я новичок в функциональном программировании и Clojure, поэтому я не совсем уверен, что делать для проекта в университете.Проект должен показать преимущество Clojure STM для банковских операций (перевод денег со счета A на счет B).Поэтому я планирую действовать следующим образом:

  1. определить начальные данные, например, матрицу ссылок или что-то лучше
  2. генерировать случайные операции для выполнения: [ random-account-source-id(0, N_MAX) , random-account-destination-id(0, N_MAX), random-money (0, 1000) ]
  3. вставить транзакцию в структуру данных
  4. Синхронизировать перевод денег из исходного идентификатора в конечный идентификатор для всех вставок в матрицу, например:
    
    for i=0; i lt N; i++;
        synchronize: transfer (matrix[i].source,matrix[i].dest,matrix[i].money)
    

I 'тогда я не уверен в этом, может быть:

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

Ответы [ 2 ]

6 голосов
/ 03 марта 2012

Представьте счет с Ref, т.е. Ref для каждого аккаунта, и выполните операцию перевода денег в операции dosync. Также убедитесь, что вы не выполняете никаких операций с побочными эффектами (кроме этих ссылок) в операции dosync, поскольку она может быть повторена в случае конфликта при обновлении ссылок.

Обновление: Если у вас будет фиксированное количество учетных записей, вы можете использовать ссылку на векторы, где каждая ссылка в векторе является учетной записью, а каждая учетная запись идентифицируется индексом в векторе.

Ex:

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

В случае, если вам нужно динамически добавлять новые учетные записи и идентифицировать их по имени, вы можете использовать хэш-карту, где ключ - это идентификатор учетной записи (уникальное значение), а значение - ссылка для баланса счета. Вам нужно будет обернуть эту карту в ссылку на случай, если вы хотите выполнить параллельные операции для добавления / удаления учетных записей из нескольких потоков.

4 голосов
/ 04 марта 2012

Вас может заинтересовать этот пример STM Clojure, используемого для банковских операций , который я разместил в ответ на другой вопрос.

...