Ответы в терминах Clojure, вот несколько примеров из скриншота Шона Девлина :
(def a-promise (promise))
(deliver a-promise :fred)
(def f (future (some-sexp)))
(deref f)
Обратите внимание, что в обещании вы явно предоставляете значение, которое вы выбрали в последующих вычислениях (:fred
в этом случае). С другой стороны, будущее потребляется там же, где оно было создано. some-expr
предположительно запускается за кулисами и рассчитывается в тандеме (в конце концов), но если он остается неопределенным к моменту обращения к блокам потоков, пока он не станет доступен.
отредактировано для добавления
Чтобы еще больше отличать обещание от будущего, обратите внимание на следующее:
обещание
- Вы создаете
promise
. Этот объект обещания теперь может быть передан в любой поток.
- Вы продолжаете вычисления. Это могут быть очень сложные вычисления, включающие побочные эффекты, загрузку данных, ввод данных пользователем, доступ к базе данных, другие обещания - все что угодно. Код будет очень похож на ваш основной код в любой программе.
- Когда вы закончите, вы можете
deliver
получить результаты для этого объекта обещания.
- Любой предмет, который попытается
deref
выполнить ваше обещание до того, как вы закончите свои вычисления, заблокируется, пока вы не закончите. Как только вы закончите и вы deliver
измените обещание, обещание больше не будет блокироваться.
будущее
- Вы создаете свое будущее. Частью вашего будущего является выражение для расчета.
- Будущее может исполниться или не исполниться одновременно. Может быть назначен поток, возможно, из пула. Это может просто подождать и ничего не делать. С вашей точки зрения вы не можете сказать .
- В какой-то момент вы (или другая нить)
deref
видите будущее. Если расчет уже завершен, вы получите его результаты. Если он еще не завершен, вы блокируете, пока он не завершен. (Предположительно, если он еще не запущен, deref
означает, что он начинает выполняться, но это тоже не гарантируется.)
Хотя вы могли бы сделать выражение в будущем таким же сложным, как и код, который следует за созданием обещания, сомнительно, что это желательно. Это означает, что фьючерсы действительно больше подходят для быстрых фоновых вычислений, в то время как обещания действительно больше подходят для больших и сложных путей выполнения. Кроме того, обещания кажутся с точки зрения доступных расчетов немного более гибкими и ориентированными на создателя обещаний, выполняющего работу, и на другой поток, собирающий урожай. Фьючерсы больше ориентированы на автоматический запуск потока (без уродливых и подверженных ошибкам накладных расходов) и на другие вещи, пока вам - исходному потоку - не понадобятся результаты.