Чем отличаются Clojure futures и promises?



и фьючерсы, и обещания блокируются, пока они не рассчитали свои значения, так в чем же разница между ними?

704   4  

4 ответов:

отвечая в терминах Clojure, вот несколько примеров из скринкаст Шона Девлина:

(def a-promise (promise))
(deliver a-promise :fred)

(def f (future (some-sexp)))
(deref f)

обратите внимание, что в обещании вы явно предоставляете значение, которое вы выбираете в более позднем вычислении (:fred в данном случае). С другой стороны, будущее потребляется в том же месте, где оно было создано. Элемент some-expr предположительно запускается за кулисами и вычисляется в тандеме (в конечном итоге), но если он остается недооцененным к тому времени, когда он доступ к блокам потока, пока он не будет доступен.


редактировать, чтобы добавить

чтобы помочь еще больше отличить обещание от будущего, обратите внимание на следующее:

обещание

  1. создать promise. Этот объект promise теперь может быть передан в любой поток.
  2. вы продолжаете вычисления. Это могут быть очень сложные расчеты с участием побочных эффектов, загрузка данных, пользовательский ввод, доступ к базе данных, другие обещания-все, что вам нравится. Код будет очень похож на ваш основной код в любой программе.
  3. когда вы закончите, вы можете deliver результаты к этому объекту обещания.
  4. любой элемент, который пытается deref ваше обещание, прежде чем вы закончите с вашим расчетом будет блокировать, пока вы не закончите. Как только вы закончите, и вы deliverЭд обещание, обещание не блокировать длиннее.

будущее

  1. вы создаете свое будущее. Часть вашего будущего-это выражение для расчета.
  2. будущее может выполняться или не выполняться одновременно. Это может быть назначен поток, возможно, из пула. Он мог просто ждать и ничего не делать. С вашей точки зрения вы не можете сказать.
  3. в какой-то момент Вы (или другой поток) derefs будущее. Если расчет уже завершен, вы получаете результат этого. Если он еще не завершен, вы блокируете, пока он не будет завершен. (Предположительно, если он еще не начался, derefing это означает, что он начинает выполняться, но это тоже не гарантируется.)

а вы может сделать выражение в будущем столь же сложным, как код, который следует за созданием обещания, сомнительно, что это желательно. Это означает, что фьючерсы действительно больше подходят для быстрых, фоновых расчетов, в то время как обещания действительно больше подходит для больших, сложных путей выполнения. Кроме того, обещания кажутся, с точки зрения доступных вычислений, немного более гибкими и ориентированными на создателя обещаний, выполняющего работу и другую нить, пожинающую урожай. Фьючерсы больше ориентированы на автоматический запуск потока (без уродливых и подверженных ошибкам накладных расходов) и продолжение других вещей, пока вам-исходному потоку-не понадобятся результаты.

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

В случае будущее the вычисление определяется во время будущего создания и асинхронного выполнения начинается "ASAP". Он также "знает", как создать асинхронное вычисление.

В случае обещание the вычисление, его время начала и [возможно] асинхронный вызов отделены от механизма доставки. Когда вычисление результат доступен производитель должен позвонить deliver явно, что также означает, что производитель контролирует , когда результате будет доступен.

Ибо обещания Clojure делает ошибку проектирования, используя тот же объект (результат promise звонок) как производить (deliver) и потреблять (deref) результат вычисление. Это две очень разные возможности и должны рассматриваться как таковые.

уже есть отличные ответы, поэтому только добавив" Как использовать " резюме:

и

создание promise или future немедленно возвращает ссылку. Эта ссылка блокируется на @ / deref до тех пор, пока результат вычисления не будет предоставлен другим потоком.

будущее

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

обещание

вы не даете никаких аргументов при создании promise. Ссылка должна быть передана другому потоку "пользователь", который будет deliver результат.

во-первых, a Promise Это Future. Я думаю, вы хотите знать разницу между Promise и FutureTask.

A Future представляет значение, которое в настоящее время неизвестно, но будет известно в будущем.

A FutureTask представляет результат вычисления, которое произойдет в будущем (возможно, в некотором пуле потоков). При попытке получить доступ к результату, если вычисление еще не произошло, он блокируется. В противном случае результат возвращается сразу. Есть никакая другая сторона, участвующая в вычислении результата, поскольку вычисление не указано вами заранее.

A Promise представляет собой результат, который будет доставлен обетовавшим для кредитора в будущем. В этом случае вы не промисее и обетовавшим заключается в том, что тот, кто дал тебе

Comments

    Ничего не найдено.