Хобрук: Ваш путь к мастерству в программировании

Почему будущее clojure блокирует основной поток?

У меня есть тривиальный лейн-проект, в котором -main содержит будущее:

(def f (future 42))

(defn -main [& args]
  (println @f))

Когда я запускаю lein run, он печатает 42, но не возвращается.

Я не понимаю, почему он не возвращается?

Как заставить lein run вернуться?

19.11.2014

  • Что значит не возвращается? Вы имеете в виду, что lein зависает навсегда? 19.11.2014

Ответы:


1

Ваш вопрос действительно двоякий:

  1. Почему лейн не возвращается?

lein зависает, потому что пул потоков, который поддерживает фьючерсы Clojure, не использует потоки демона, поэтому вам нужно явно отключить его. Если вы измените свой код на следующий, он должен работать:

(def f (future 42))

(defn -main [& args]
  (println @f)
  (shutdown-agents))
  1. Фьючерсы блокируют основной поток

Строка (println @f) потенциально может заблокировать основной поток при «разыгрывании» f, если будущее еще не завершило свою работу.

Это ограничение фьючерсов Clojure, которое можно устранить с помощью core.async или RxClojure. Я также работаю над альтернативной реализацией фьючерсов для Clojure, исходный код которой планирую открыть очень скоро, и решить эти проблемы.

19.11.2014
  • Почему бы просто не проверить возвращаемое значение (realized? f) перед удалением ссылок? (if (realized? f) @f "pending...") 19.11.2014
  • Этого недостаточно. Если это еще не реализовано, вам понадобится способ подождать и продолжить попытки, которые свяжут другой поток (или основной поток). Что вам действительно нужно, так это возможность запускать фрагмент кода после того, как будущее завершится. Этого еще не существует. И запускать еще один поток только для того, чтобы дождаться будущего — это излишество. 20.11.2014
  • Новые материалы

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..