В чем разница между будущим и обещанием? (В Акке и Гпарсе.)
Они выглядят так же, как и блок, и возвращают значение будущего, когда вызывается get, и обещание получить результат будущего.
В чем разница между будущим и обещанием? (В Акке и Гпарсе.)
Они выглядят так же, как и блок, и возвращают значение будущего, когда вызывается get, и обещание получить результат будущего.
Ответы:
Я буду говорить об Akka / Scala, потому что я не знаком ни с Gpars, ни с Akka / Java.
В Scala 2.10, которая включает соответствующую часть Akka в стандартном дистрибутиве, a Future
по существу является ссылкой только для чтения на значение, которое еще предстоит вычислить. Promise
Это почти так же , за исключением того, что вы можете написать к нему , а также . Другими словами, вы можете читать как из Future
s, так и из Promise
s, но вы можете писать только из Promise
s. Вы можете получить Future
связанное с a Promise
, вызвав для него future
метод, но преобразование в другом направлении невозможно (потому что это будет бессмысленно).
Согласно википедии , это одно и то же понятие:
В информатике будущее, обещание и задержка относятся к конструкциям, используемым для синхронизации в некоторых параллельных языках программирования. Они описывают объект, который действует как прокси для результата, который первоначально неизвестен, обычно потому, что вычисление его значения еще не завершено.
Некоторые библиотеки могут назвать их одним способом, некоторые могут назвать их другим. И каждый раз они могут быть реализованы в разных вариантах. Некоторые библиотеки могут использовать эти синонимы для различения разных вкусов. Хотя я бы сказал, что это плохой выбор (потому что, очевидно, он смущает людей), эта ссылка предполагает, что в Scala это обычная практика.
Как предположил Flame @ Ptharien, в Scala a Future
- это операция только для чтения, а a Promise
дает вам возможность получить результат (или неудачу) для операции, которую она представляет.
Promise
Таким образом, A лучше всего использовать код, ответственный за выполнение операции по распространению результата, в то время как a Future
используется для представления его клиентскому коду, который, в свою очередь, будет ожидать результата. Но опять же, обратите внимание, что это различие специфично для Scala и может сбить с толку посторонних.
Я добавлю немного здесь, потому что я работал с множеством Futures на Java в последнее время, но также имею опыт разработки Scala / Akka. Этот ответ будет в основном дублировать сказанное, но покажет множество реализаций, широко используемых сегодня на JVM.
Во-первых, в оригинальном постере упоминается использование get и blocking - никогда не делайте этого вне тестов.
Когда я преподаю концепции FP и Concurrency в своей текущей роли, я сначала говорю студенту, что семантически обещания и фьючерсы являются синонимами, потому что, как потребитель обещания или будущего API, разработчик не должен понимать, что они есть или если они есть. семантические различия - только механика для их обработки без блокировки ввода-вывода.
Сказать, что будущее не может быть завершено, и что обещание может (например, согласно scala / akka / play apis) слишком упрощенно:
Некоторые Futures могут быть завершены Java8 теперь представляет CompletableFuture в стандартной библиотеке.
Некоторые Обещания не могут быть выполнены Аналогичным образом, в API обещаний Play не может быть выполнено Обещание, но RedeemablePromise может, таким образом, ввести другую семантику, даже находясь под зонтиком Typesafe. Кроме того, API обещаний Play может конвертировать с фьючерсами scala в обоих направлениях - (F.Promise.wrap (future) или promise.wrapped ()).
Работая с технологией Typesafe на Java8, вы часто будете переключаться между фьючерсами и обещаниями просто потому, что предпочтителен один API (Play Promise API кажется лучше с лямбдами Java8). На Akka + Play + Java8 вы будете брать фьючерсы от Actors и превращать их в обещания, составлять обратные вызовы и возвращать их из контроллера.
Итак, как я говорю людям, когда я преподаю, Обещания и Фьючерсы являются более или менее синонимами.