От новичка до гуру: Курсы программирования на 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
  • Новые материалы

    Matt’s Tidbits #99  — «Элегантная обработка нуля»
    На прошлой неделе я писал о некоторых крайних случаях правдоподобия в JavaScript . На этот раз у меня есть небольшая заметка об элегантной обработке нулевых/неопределенных значений. null..

    Обучение работе с AWS с Habana Gaudi
    Использование возможностей выделенных обучающих чипов DNN — часть 2 В октябре прошлого года AWS объявила о появлении типа инстанса Amazon EC2 DL1 . DL1, оснащенный восемью ускорителями..

    Сортировка вставками с помощью JavaScript
    Простые типы алгоритмов сортировки Пузырьковая сортировка ➝ O(n²) Сортировка вставками ➝ O(n²) Сортировка выбором ➝ O (n²) Сортировка слиянием ➝ O (n * log n) Быстрая сортировка ➝..

    Я попросил ChatGPT решить 5 вопросов по программированию LeetCode
    ChatGPT , диалоговый ИИ от OpenAI , выпущенный в ноябре 2022 года, может понять и ответить практически на все, что вы спросите. У него есть возможность писать стихи, штамповать эссе и писать..

    DevTools, которые изменили мою жизнь
    Самые эффективные инструменты разработчика, которые я встречал за свою карьеру Время от времени вы сталкиваетесь с инструментом, который расширяет ваши способности сверхспособностями и..

    Веб-приложение для чата с использованием Phoenix и Vue.js - Часть 6
    В этой части мы рассмотрим перенос вещей в отдельные компоненты. Вот все части этой серии: Github: https://github.com/jespr/vue-phoenix-chat Heroku:..

    Почему веб-сборка меняет правила игры? (Часть 1)
    Эта статья написана, чтобы помочь новичкам понять основные концепции: с чего начать? Что для вас есть и какие реальные проблемы вы можете решить? Я уже некоторое время слышу термин..