#multithreading #clojure #reload
#многопоточность #clojure #перезагрузить
Вопрос:
Я только что обнаружил интересную особенность :reload-all
. Допустим, у меня есть:
(defn clock-update [clock] (swap! clock (fn [previousTime] ( previousTime 1) ) ) )
(def threads (Executors/newScheduledThreadPool 16))
(defn start-clock [clock]
(. threads scheduleAtFixedRate
#(clock-update clock) 0 1 TimeUnit/SECONDS ))
и я (start-clock clock)
где clock — это атом, за которым я наблюдаю, ХОРОШО, если я затем изменю обмен атомами! функция (скажем, изменить на -) в clock-update и (use :reload-all 'myns)
затем угадайте, что эта функция используется для обновления atom для существующих потоков вместо этого! Я этого не ожидал. Я думал, что существующие потоки будут продолжать ссылаться на любую функцию, с помощью которой они были созданы.
Комментарии:
1. Это определенно по-прежнему работает с :reload, а также с :reload-all. Я попробовал это.
2. Я неявно спрашивал «почему?»
Ответ №1:
Как объясняется в документации
def всегда применяется к корневой привязке, даже если var привязан к потоку в точке, где вызывается def.