Сопрограммы и обработка асинхронности в лучших практиках clojure(сценарий)?

#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 может существовать альтернатива.