В чем разница между будущим и обещанием?

73

В чем разница между будущим и обещанием? (В Акке и Гпарсе.)

Они выглядят так же, как и блок, и возвращают значение будущего, когда вызывается get, и обещание получить результат будущего.

Суминда Сиринатх С. Дхармасена
источник
4
«Будущее обещает производитель, потребитель». (Но для программирования поменяйте местами последние два, потому что Futures (ноль или более) аналогичен потреблению значения, а Promise (только с первым, способным преуспеть) аналогичен получению значения.)
rwong
Удивительная лекция о будущих / обещаниях по Coursera «Принципы программирования» Reactive по Одерский, Эрику Мейер, Роланд Кун: class.coursera.org/reactive-001/lecture , 3 -я неделя
GKislin
@rwong: «Будущее обещает производителям потребителей» - а? Должно ли это быть осмысленным предложением, действующим как мнемоника, напоминающая нам о разнице между фьючерсами и обещаниями? Мой мозг полностью не смог разобрать его. А также вы говорите, что это неправильно и требует замены слов, но по какой-то причине вы не просто сделали это, прежде чем набирать его. И, наконец, это в кавычках, но поиск в Google не вызывает никаких хитов, кроме вашего комментария. Мег перегородок.
Бакар

Ответы:

54

Я буду говорить об Akka / Scala, потому что я не знаком ни с Gpars, ни с Akka / Java.

В Scala 2.10, которая включает соответствующую часть Akka в стандартном дистрибутиве, a Futureпо существу является ссылкой только для чтения на значение, которое еще предстоит вычислить. PromiseЭто почти так же , за исключением того, что вы можете написать к нему , а также . Другими словами, вы можете читать как из Futures, так и из Promises, но вы можете писать только из Promises. Вы можете получить Futureсвязанное с a Promise, вызвав для него futureметод, но преобразование в другом направлении невозможно (потому что это будет бессмысленно).

Пламя Птариена
источник
3
Связанный: stackoverflow.com/questions/13381134/…
rwong
19

Согласно википедии , это одно и то же понятие:

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

Некоторые библиотеки могут назвать их одним способом, некоторые могут назвать их другим. И каждый раз они могут быть реализованы в разных вариантах. Некоторые библиотеки могут использовать эти синонимы для различения разных вкусов. Хотя я бы сказал, что это плохой выбор (потому что, очевидно, он смущает людей), эта ссылка предполагает, что в Scala это обычная практика.

Как предположил Flame @ Ptharien, в Scala a Future- это операция только для чтения, а a Promiseдает вам возможность получить результат (или неудачу) для операции, которую она представляет.

PromiseТаким образом, A лучше всего использовать код, ответственный за выполнение операции по распространению результата, в то время как a Futureиспользуется для представления его клиентскому коду, который, в свою очередь, будет ожидать результата. Но опять же, обратите внимание, что это различие специфично для Scala и может сбить с толку посторонних.

back2dos
источник
Это относится и к JS Promises и Python Futures.
Ник Свитинг
6

Я добавлю немного здесь, потому что я работал с множеством 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 и превращать их в обещания, составлять обратные вызовы и возвращать их из контроллера.

Итак, как я говорю людям, когда я преподаю, Обещания и Фьючерсы являются более или менее синонимами.

JasonG
источник