Y a-t-il un moyen de sonder si les transactions STM de Clojure sont en cours de récupération et à quel taux? p>
3 Réponses :
Vous pouvez observer le nombre d'historique code> d'une référence qui indiquera qu'il y aura de la conflit: (dosync
(swap! try-count inc)
...)
Jamais pensé à utiliser le nombre d'historique, ni des atomes au sein de TXS. Merci pour les suggestions!
en introduisant nommé des blocs dosync em> et commettes em> (Times une DOSYNC nommée a réussi), on peut très facilement garder une trace des threads des temps a réessayé une transaction donnée . ;; {thread-id {tx-name {commit-number tries-count}}}
{40 {:x {3 1, 2 4, 1 3, 0 1}}, 39 {:x {2 1, 1 3, 0 1}}, ...}
Cette implémentation supplémentaire est sensiblement plus simple.
;; {thread-id retries-of-latest-tx}
(def tries (atom {}))
;; The max amount of tries any thread has performed
(def max-tries (atom 0))
(def ninc (fnil inc 0))
(def reporter (agent nil))
(defn report [_ tid]
(swap! max-tries #(max % (get @tries tid 0)))
(swap! tries update-in [tid] (constantly 0)))
(defmacro dosync [& body]
`(clojure.core/dosync
(swap! tries update-in [(.getId (Thread/currentThread))] ninc)
(commute commit-id inc)
(send reporter report (.getId (Thread/currentThread)))
~@body))
Voir aussi: Stackoverflow.com/Questtions/4792197/...