: перезагрузить все и существующие ссылки

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