Подтвердить что ты не робот

Что такое фьючерсы?

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

4b9b3361

Ответ 1

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

Ниже приведен пример С++.


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

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)); 

или вы можете использовать способ фьючерсов, используя С++ 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); }));

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

Из статьи:

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

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

Ответ 6

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

Ответ 7

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