Какие фьючерсы? - PullRequest
       36

Какие фьючерсы?

14 голосов
/ 17 сентября 2008

Что такое фьючерсы? Это как-то связано с ленивой оценкой.

Ответы [ 7 ]

9 голосов
/ 17 сентября 2008

Есть статья Википедии о фьючерсах. Короче говоря, это способ использовать значение, которое еще не известно. Затем значение может быть рассчитано по требованию (отложенная оценка) и, необязательно, одновременно с основным расчетом.

C ++ пример.


Скажем, вы хотите вычислить сумму двух чисел. Вы можете использовать типичную реализацию:

int add(int i, int j) { return i + j; }
// first calculate both Nth_prime results then pass them to add
int sum = add(Nth_prime(4), Nth_prime(2)); 

или вы можете использовать фьючерсный способ, используя C ++ 11 std::async, который возвращает std::future. В этом случае функция add будет блокироваться, только если она попытается использовать значение, которое еще не было вычислено (можно также создать чисто ленивую альтернативу).

int add(future<int> i, future<int> j) { return i.get() + j.get(); }
int sum = add(async(launch::async, [](){ return Nth_prime(4); }),
              async(launch::async, [](){ return Nth_prime(2); }));
7 голосов
/ 17 сентября 2008

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

См. lazy.rb для Ruby или Scala, фьючерсы и ленивые оценки .

Вероятно, они могут быть реализованы на любом языке с потоками, хотя, очевидно, это будет сложнее в языке низкого уровня, таком как C, чем в языке высокого уровня.

6 голосов
/ 17 сентября 2008

Каждый упоминает фьючерсы с целью ленивого расчета. Однако другое использование, которое не так рекламируется, это использование Futures для IO в целом. Особенно они полезны для загрузки файлов и ожидания сетевых данных

3 голосов
/ 17 сентября 2008

A Future инкапсулирует отложенные вычисления и обычно используется для того, чтобы выводить ленивые вычисления на ленивый язык. При первом оценке будущего выполняется код, необходимый для его оценки, и будущее заменяется результатом.

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

0 голосов
/ 05 апреля 2011

В этом блоге дается очень подробное объяснение вместе с примером того, как вы могли бы реализовать будущее самостоятельно. Я действительно рекомендую это:)

0 голосов
/ 17 августа 2009

Фьючерсы также используются в определенных шаблонах проектирования, особенно для шаблонов реального времени, например шаблона ActiveObject, который отделяет вызов метода от выполнения метода. Будущее настроено на ожидание завершенного исполнения. Я склонен видеть это, когда вам нужно выйти из многопоточной среды для взаимодействия с однопоточным окружением. Могут быть случаи, когда часть оборудования не поддерживает ядро ​​для потоков, и в этом случае используются фьючерсы. На первый взгляд не совсем понятно, как вы будете общаться, и на удивление фьючерсы делают это довольно просто. У меня есть немного кода на C #. Я выкопаю это и отправлю это.

0 голосов
/ 17 сентября 2008

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

Из статьи:

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

Не упоминается в статье, фьючерсы - это Монада , и поэтому можно проецировать функции на будущие значения в монаду, чтобы они применялись к будущему значению, когда оно становится доступным, давая другое будущее который в свою очередь представляет результат этой функции.

...