Время для потока управления в Clojure — подводные камни ScheduledThreadPoolExecutor?

Я изучаю параллелизм в Clojure.

Я столкнулся с претензией (от Стюарта Серры?) на странице http://dev.clojure.org/display/design/Scheduled+Events с указанием:

  • Функции Clojure не могут использовать время для потока управления без блокировки или взаимодействия с Java.
  • Взаимодействие Java (ScheduledThreadPoolExecutor) не знает о привязках к локальным потокам

Я не понимаю этих утверждений и прошу разъяснений, возможно, примера. Конкретно:

  • Что не так с ScheduledThreadPoolExecutor как есть? Поскольку я начинаю новый (зеленый) поток, я не ожидаю, что привязки для каждого потока будут перенесены в любом случае.
  • Я могу запланировать обычную функцию Clojure, так что же мешает мне отправить нужные привязки как лексически закрытый контекст?

Большое спасибо!


person Thomas Heywood    schedule 16.08.2012    source источник


Ответы (1)


Хорошо, я думаю, я понял.

Предположим, вы попробуете это:

(def pool (atom nil))

(defn- thread-pool []
    (or @pool
        (reset! pool (ScheduledThreadPoolExecutor. 1))))

(def ^:dynamic *t* 0)

(binding [*t* 1]
    (future (println "first example:" *t*)))

(binding [*t* 1]
    (.schedule (thread-pool) (fn [] (println "second example:" *t*)) 0 
               TimeUnit/SECONDS))

(binding [*t* 1]
    (.schedule (thread-pool) (bound-fn [] (println "third example:" *t*)) 0
               TimeUnit/SECONDS))

Вывод будет:

first example: 1
second example: 0
third example: 1

В первом случае будущий макрос оборачивает тело приватной функцией binding-conveyor-fn, которая сохраняет фрейм привязок вызывающего потока в лексической области видимости и восстанавливает его перед вызовом обернутой функции.

В третьем случаеbound-fn помещает привязки вызывающего потока в фрейм, выполняет тело функции и извлекает привязки.

Во втором случае привязки для каждого потока никто не сохраняет — Java-класс о них точно не знает, поэтому мы опускаемся до корневого значения t Var.

Я надеюсь, что кто-то там находит это интересным.

person Thomas Heywood    schedule 17.08.2012