2013-01-14 12 views
8

Na podstawie wiersza poleceń potrzebuję ustawić niektóre stałe czasu wykonywania, które będą używane z wieloma funkcjami downstream. Kod w tych funkcjach może być wykonywany w innych wątkach, więc nie rozważam kombinacji "zadeklaruj i użyj powiązanego makra". Jakie są plusy i minusy używania var (z alter-var-root) w tym przypadku w porównaniu do użycia atomu? Oznacza to, żeZmienna versus atom dla stałych runtime

(declare *dry-run*) ; one of my constants 

(defn -main [& args] 
    ; fetch command line option 
    ;(cli args ...) 
    (alter-var-root #'*dry-run* (constantly ...)) 
    (do-stuff-in-thread-pool)) 

kontra

(def *dry-run* (atom true)) 

(defn -main [& args] 
    ; fetch command line option 
    ;(cli args ...) 
    (reset! *dry-run* ...) 
    (do-stuff-in-thread-pool)) 

Jeśli nie ma innej opcji poza tymi dwoma, które należy wziąć pod uwagę, chciałbym wiedzieć.

Ponadto, wolałbym nie podawać początkowego val do atomu, ponieważ chcę ustawić wartości domyślne w innym miejscu (z inwokacją cli), ale mogę z tym żyć, zwłaszcza jeśli użycie atomu oferuje korzyści w porównaniu do alternatywy (alternatywnych).

Odpowiedz

3

AFAIK alter-var-root gwarantuje tylko zsynchronizowaną zmianę wartości zmiennej i nie gwarantuje bezpiecznego odczytu podczas tej zmiany. Z drugiej strony atom naprawdę zapewnia atomową zmianę stanu tożsamości.

Jeśli nie chcą dostarczać wartość początkową można po prostu ustawić go nil:

(def *dry-run* (atom nil)) 
6

wartości jednokrotnego zapisu są dokładnie przypadek użycia obietnice są przeznaczone do:

(def dry-run (promise)) 

(defn -main [] 
    (deliver dry-run true)) 

(defn whatever [f] 
    (if @dry-run 
    ...)) 
+0

Dzięki za wskazówkę. Czy wartość dostarczona do obietnicy będzie widoczna we wszystkich wątkach (automatyczne przenoszenie wiązań), czy też muszę zrobić coś specjalnego? – Don

+0

Wiążący transport nie wchodzi w ogóle do obrazu za nic oprócz vars. Obietnica to po prostu obiekt Clojure, który, gdy zostanie odwołany, wygeneruje wartość, która została mu dostarczona, lub zablokuje, dopóki taka wartość nie nadejdzie. Wątki nie są bardziej istotne niż byłyby, gdybyś zdefiniował globalną mapę skrótów. – amalloy

2

Co jest nie tak z używaniem var i alter-var-root? Ustawiasz nową wartość w funkcji uruchamiania, zanim naprawdę rozpoczniesz pracę. Tak więc nie ma wyścigu w czytaniu. I możesz zapisać @ wszędzie tam, gdzie potrzebujesz tej wartości.

+0

Dzięki za odpowiedź. To jest to o czym myślałem.. – Don