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