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

OSCHINA-MIRROR/Atry-stateless-future

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

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

Является ли какой-либо здравомыслящий разработчик способным сказать, какие 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 )

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

Введение

Набор предметно-ориентированных языков для асинхронного программирования в духе чистого функционализма. Развернуть Свернуть
Apache-2.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