Вопрос

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

Это было полезно?

Решение

Отвечая в условиях Clojure, вот несколько примеров из Sean Devlin's Screencast:

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

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

Обратите внимание, что в обещании вы явно доставляете значение, которое вы выбираете в более поздних вычислениях (:fred в этом случае). Будущее, с другой стороны, потребляется в том же месте, что оно было создано. То some-expr Предположительно запущен за кулисами и рассчитывается в тандеме (в конце концов), но если оно остается неравновешенным к тому времени, доступ к блокам потоков до него доступен.


отредактировано для добавления

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

обещать

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

будущее

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

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

Другие советы

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

В случае Будущее то вычисление Определяется во время будущего создания и асинхронизация начинается «как можно скорее». Это также «знает», как порождать асинхронные вычисления.

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

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

Есть уже отличные ответы, поэтому добавляя только «Как использовать» сводку:

Обе

Создание обещания или будущего возвращает ссылку немедленно. Это эталонные блоки на @ / deref до результата вычислений предоставляются другой нитью.

Будущее

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

Обещать

Вы не даете аргументов при создании обещания. Ссылка должна быть передана на другой «пользователь» нить, которая будет deliver результат.

Во-первых, а Promise это Future. Отказ Я думаю, что вы хотите знать разницу между Promise и а FutureTask.

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

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

А. Promise Представляет результат, который будет доставлен програйдером промиреме в будущем. В этом случае вы промышленный и провизер - это тот, кто дал вам Promise объект. Похож на FutureTask, Если вы попытаетесь получить доступ к результату до Promise был выполнен, он заблокирован, пока Progriser не соответствует Promise. Отказ Однажды Promise Выполняется, вы получаете то же значение всегда и немедленно. В отличие от А. FutureTask, здесь есть другая сторона, которую здесь, которая сделала Promise. Отказ Что другая сторона несет ответственность за вычисление и выполнение Promise.

В этом смысле, FutureTask это Promise Вы сделали себе.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top