#clojure #clojurescript
Вопрос:
Похоже, в clojure существует множество реализаций «сопрограмм» или асинхронной логики, многие из выступлений Рича Хикки и других потенциальных авторитетов по этому вопросу относятся к почти десятилетней давности, и я пытаюсь выяснить, какой самый последний и лучший, наилучший практический способ решения этой проблемы.
Моя любимая абстракция для такого рода вещей-это сообразности lua, но я думаю, что это может быть строго императивный стиль действий, и я немного смущен тем, что вместо этого функциональный способ.
В lua, хотя это действительно просто и легко с сопрограммами, чтобы:
А) Незанятое ожидание в течение X секунд.
Б) Незанятое ожидание, пока переменная или функция будут иметь определенное значение, например true
A, вероятно, может быть достигнуто с помощью setTimeout, но B на самом деле не может, по крайней мере, я не знаю, как это сделать. Я также не уверен, что setTimeout — лучшая практика для таких проблем?
Ответ №1:
В сообщении в блоге 2013 года Рич Хики описывает мотивы для clojure.core.async
. В то время как у JVM есть некоторые приложения, основным мотивом было создание иллюзии потоков в однопоточной среде Javascript.
«Имитируемая многопоточность», предоставляемая компанией clojure.core.async
, не так надежна, как при использовании реальных потоков JVM (особенно при возникновении исключений/ошибок), поэтому она имеет ограниченное применение для JVM Clojure. Это будет еще более верно, когда виртуальные потоки Java станут реальностью.
Так что, если вы находитесь в ClojureScript, clojure.core.async
это намного лучше, чем ничего (т. Е. Ад обратного вызова). Однако даже JS рассматривает многопоточную модель с помощью WebAssembly, поэтому clojure.core.async
в будущем для ClojureScript может существовать альтернатива.