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/...