От новичка до гуру: Курсы программирования на CyberDuff

Clojure core.async, в чем смысл исключения Pop без сопоставления push в clojure.lang.Var.popThreadBindings(Var.java:364)?

Clojure 1.5.1 и библиотека Core.async версии «0.1.267.0-0d7780-alpha» используются для выполнения вычислений с интенсивным использованием ЦП. Набор функций, обернутых функцией тайм-аута thunk-timeout отправляются на канал, как показано в фиктивном коде ниже.

(defn toSendToGo [args timeoutUnits]
  (let [result (atom [false])  
        timeout? (atom false)]
    (try
      ( thunk-timeout
        (fn []  (reset! result  (myFunction args))) timeoutUnits)
      (catch  java.util.concurrent.TimeoutException e  (do  (prn "!Time out after " timeoutUnits " seconds!!") (reset! timeout? true))     ))

    (if @timeout?  (do sth))
    @result))


(let [c ( chan)]
  (go (>! c (toSendToGo args timeoutUnits))))

На сервере Linux с большим объемом памяти код работает без проблем. На сервере Windows с меньшим объемом памяти, если бы в нескольких случаях подряд истекло время ожидания, возникло бы это странное исключение, которое я не совсем понимаю. Почему это связано с тайм-аутом?

Exception in thread "my-async-dispatch-4" java.lang.IllegalStateException: Pop w
ithout matching push
        at clojure.lang.Var.popThreadBindings(Var.java:364)
        at clojure.core$pop_thread_bindings.invoke(core.clj:1737)
        at regtest$fn__40$processRegtestFiles__41$fn__96$state_machine__3962__auto____97$fn__99.invoke(regtest.clj:158)
        at regtest$fn__40$processRegtestFiles__41$fn__96$state_machine__3962__auto____97.invoke(regtest.clj:158)
        at clojure.core.async.impl.ioc_macros$run_state_machine.invoke(ioc_macros.clj:945)
        at clojure.core.async.impl.ioc_macros$run_state_machine_wrapped.invoke(ioc_macros.clj:949)
        at regtest$fn__40$processRegtestFiles__41$fn__96.invoke(regtest.clj:158)
        at clojure.lang.AFn.run(AFn.java:24)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
Exception in thread "my-async-dispatch-5" java.lang.IllegalStateException: Pop w
ithout matching push
        at clojure.lang.Var.popThreadBindings(Var.java:364)
        at clojure.core$pop_thread_bindings.invoke(core.clj:1737)
        at regtest$fn__40$processRegtestFiles__41$fn__96$state_machine__3962__au
to____97$fn__99.invoke(regtest.clj:158)
        at regtest$fn__40$processRegtestFiles__41$fn__96$state_machine__3962__au
to____97.invoke(regtest.clj:158)
        at clojure.core.async.impl.ioc_macros$run_state_machine.invoke(ioc_macro
s.clj:945)
        at clojure.core.async.impl.ioc_macros$run_state_machine_wrapped.invoke(i
oc_macros.clj:949)
        at regtest$fn__40$processRegtestFiles__41$fn__96.invoke(regtest.clj:158)

        at clojure.lang.AFn.run(AFn.java:24)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)

[ОБНОВЛЕНИЕ]

Проблема исчезла после добавления выражения catch после выражения catch для TimeoutException:

(try...
  (catch  java.util.concurrent.TimeoutException e  (do (prn "!Time out after " timeoutUnits " seconds!!") (reset! timeout? true))     )
  (catch Exception e (prn "Unexpected exception " e) ))

С пойманным исключением

Unexpected exception  #<ExecutionException java.util.concurrent.ExecutionException: java.lang.NoClassDefFoundError: slingshot/Stone

  • Кложур версии 1.5.1 12.03.2014

Ответы:


1

Я не уверен, что это ваша проблема, но (toSendToGo) возвращает nil через атом результата, если обнаружено исключение.

Затем этот ноль помещается в chan c. Каналы Core.async не должны (и обычно не могут) иметь значение nil. Вы по-прежнему получаете ошибку при сбросе результата перехвата на что-либо, кроме «nil» (возможно, попробуйте «false»?)?

Кроме того, clojure, будучи шепелявым, склонен отдавать предпочтение строчным буквам с дефисами для имен большинства вещей. Вместо этого toSendToGo, вероятно, следует использовать to-send-to-go. Я не знаю ни одного официального руководства по стилю, но вот ссылка на самое подробное из известных мне: https://github.com/bbatsov/clojure-style-guide

(P.S. Вероятно, это должен был быть комментарий, но у меня пока нет достаточной репутации, чтобы сделать их.)

14.03.2014
  • Я проверил свой реальный код, и на самом деле атом результата имеет ненулевое значение по умолчанию. Я обновил приведенный выше пример. Спасибо за руководство по стилю, оно полезно 17.03.2014
  • Новые материалы

    Представляем Narwhal Technologies (Nrwl)
    6 декабря 2016 г. Маунтин-Вью, Калифорния С тех пор, как Виктор Савкин и я (Джефф Кросс) присоединились к команде Angular в Google на заре Angular 1, Angular продемонстрировал феноменальный..

    Путь AWS  — «Изучение машинного обучения — 10 начинающих ИИ и машинного обучения на AWS».
    Универсальный ресурсный центр для изучения искусственного интеллекта и машинного обучения. НОЛЬ или ГЕРОЙ, начните свое путешествие здесь. Получите решения и пройдите обучение у экспертов AWS...

    5 простых концепций Python, ставших сложными
    #заранее извините 1) Переменные x = 4 y = 5 Переменная в Python — это символическое представление объекта. После присвоения некоторого объекта переменной Python мы приобретаем..

    «Освоение вероятности: изучение совместной, предельной, условной вероятности и теоремы Байеса —…
    Виды вероятности: Совместная вероятность Предельная вероятность Условная вероятность Диаграмма Венна в вероятностях: В “Set Theory” мы создаем диаграмму Венна...

    Основы Spring: Bean-компоненты, контейнер и внедрение зависимостей
    Как лего может помочь нашему пониманию Когда мы начинаем использовать Spring, нам бросают много терминов, и может быть трудно понять, что они все означают. Итак, мы разберем основы и будем..

    Отслеживание состояния с течением времени с дифференцированием снимков
    Время от времени что-то происходит и революционизирует часть моего рабочего процесса разработки. Что-то более забавное вместо типичного утомительного и утомительного процесса разработки. В..

    Я предполагаю, что вы имеете в виду методы обработки категориальных данных.
    Я предполагаю, что вы имеете в виду методы обработки категориальных данных. Пожалуйста, проверьте мой пост Инструментарий специалиста по данным для кодирования категориальных переменных в..