1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/Atry-stateless-future

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 5.9 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 02.12.2024 03:22 e220a64

Вот перевод текста на русский язык:

Является ли какой-либо здравомыслящий разработчик способным сказать, какие catchers получат исключения?

Существует слишком много концепций об исключениях при работе с scala.concurrent.Future. Вы должны помнить о различных стратегиях обработки исключений между flatMap, recover, recoverWith и onFailure, а также о разнице между scala.concurrent.Future.failed(new Exception) и scala.concurrent.future { throw new Exception }.

scala.async не делает ситуацию лучше, потому что scala.async будет выдавать ошибки компилятора для каждого await в операторах try.

К счастью, вы можете избавиться от всех этих концепций, если переключитесь на stateless-future. В stateless Futures нет неявного параметра catcher ни в flatMap, ни в map, ни метода onFailure или recover вообще. Вы просто пытаетесь, и всё делается. Смотрите примеры, чтобы узнать это.

Оптимизация хвостового вызова

Оптимизация хвостового вызова является важной функцией для чистого функционального программирования. Без оптимизации хвостового вызова многие рекурсивные алгоритмы потерпят неудачу во время выполнения, и вы получите хорошо известную ошибку StackOverflowError.

Язык Scala предоставляет scala.annotation.tailrec для автоматической оптимизации простых хвостовых рекурсий и scala.util.control.TailCalls для ручной оптимизации сложных хвостовых вызовов.

Проект stateless-future внутренне основан на scala.util.control.TailCalls и автоматически выполняет оптимизацию хвостового вызова в магических блоках Future, без какого-либо дополнительного специального синтаксиса.

Смотрите этот пример. Он просто работает, и никаких ошибок StackOverflowError или OutOfMemoryError не возникает. Обратите внимание, что если вы перенесёте этот пример на scala.async, он вызовет OutOfMemoryError или TimeoutException.

Сравнение

Для Scala существовал плагин продолжения. Плагин продолжения также предоставляет DSL для определения потоков управления, таких как stateless-future или scala.async. Я создал следующую таблицу для сравнения трёх DSL:

stateless-future scala.concurrent.Future и scala.async scala.util.continuations
Stateless Да Нет Да
Threading-free Да Нет Да
Обработка исключений в «A-Normal Form» Да Нет Нет
Оптимизация хвостового вызова в «A-Normal Form» Да Нет Нет
Сопоставление с образцом в «A-Normal Form» Да Да Нестабильно
Lazy val в «A-Normal Form» Нет из-за некоторых основных ошибок scala.reflect Только для тех, которые не содержат await Нестабильно

Установка Добавьте эти строки в ваш build.sbt, если вы используете Sbt (http://www.scala-sbt.org/):

libraryDependencies += "com.qifun" %% "stateless-future" % "0.1"

stateless-future должен работать со Scala 2.10.3, 2.10.4 или 2.11.0.

Известные проблемы

Клонируйте stateless-future-test (https://github.com/Atry/stateless-future-test) и запустите тестовые случаи, чтобы проверить эти ограничения.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/Atry-stateless-future.git
git@api.gitlife.ru:oschina-mirror/Atry-stateless-future.git
oschina-mirror
Atry-stateless-future
Atry-stateless-future
master