2008-09-17 26 views
14

¿Qué son los futuros? Tiene algo que ver con la evaluación perezosa.¿Qué son los futuros?

+0

Los futuros no tienen que ver necesariamente con Lazy Evaluation. De hecho, para muchos casos de uso, los futuros Lazy son exactamente lo que no necesita: IO, Networking, etc ... – brice

+0

¡Los "Futuros" están recibiendo mucha exposición a través de JavaScript! Pero la terminología en el dominio de JavaScript es "diferida" y "promete". – hippietrail

Respuesta

3

A Future encapsula un cálculo diferido, y se usa comúnmente para calzar la evaluación perezosa en un lenguaje no perezoso. La primera vez que se evalúa un futuro, se ejecuta el código requerido para evaluarlo y el futuro se reemplaza con el resultado.

Como se reemplaza el futuro, las evaluaciones posteriores no ejecutan el código de nuevo, y simplemente dan el resultado.

7

Cuando crea un futuro, se inicia un nuevo hilo de fondo que comienza a calcular el valor real. Si solicita el valor del futuro, se bloqueará hasta que el hilo haya terminado de calcularse. Esto es muy útil cuando necesita generar algunos valores en paralelo y no desea realizar un seguimiento manual de todo.

Ver lazy.rb para Ruby, o Scala, futures, and lazy evaluation.

Probablemente se pueden implementar en cualquier idioma con subprocesos, aunque obviamente sería más difícil en un lenguaje de bajo nivel como C que en un lenguaje funcional de alto nivel.

+0

AFAIK, los futuros no comienzan a ejecutarse hasta que realmente se soliciten. Los futuros a menudo se usan para construir una barrera perezosa, p. para implementar una estructura infinita Si los futuros comenzaron a ejecutarse inmediatamente después de la creación, no serían adecuados para esto. – 0124816

+1

@ 012 ...: Verifique los enlaces que publiqué, dan una buena descripción de los futuros. –

+2

http://en.wikipedia.org/wiki/Futures_and_promises#Distinction_between_futures_and_promises Parece ser una referencia más definitiva. (¡Hah! Wikipedia!) Resumen: los futuros comenzaron siendo no ejecutados simultáneamente; ahora algunos los definen como si lo hicieran, y le han cambiado el nombre al concepto original de Promesa. – 0124816

9

Hay un Wikipedia article sobre futuros. En resumen, es una forma de usar un valor que aún no se conoce. El valor puede calcularse a demanda (evaluación diferida) y, opcionalmente, al mismo tiempo que el cálculo principal.

C++ ejemplo a continuación.


Supongamos que quiere calcular la suma de dos números. Usted puede tener la típica aplicación ansiosos:

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

o puede utilizar los futuros de manera usando C++ de 11 std::async, que devuelve una std::future. En este caso, la función add solo bloqueará si intenta utilizar un valor que aún no se ha calculado (también se puede crear una alternativa puramente diferida).

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

Todo el mundo menciona los futuros a los fines del cálculo diferido. Sin embargo, otro uso que no se anuncia como es el uso de Futures para IO en general. Especialmente son útiles para cargar archivos y esperar datos de la red

0

The Wiki Article ofrece una buena visión general de futuros. El concepto se usa generalmente en sistemas concurrentes, para programar cómputos sobre valores que pueden o no haber sido computados aún, y además, cuyo cálculo puede o no estar ya en progreso.

Desde el artículo:

Un futuro está asociado con un hilo específico que calcula su valor . Este cálculo se puede iniciar con entusiasmo cuando se cree el futuro , o de forma perezosa cuando su valor es primero necesario.

No se menciona en el artículo, los futuros son un Monad, por lo que es posible con las funciones de los valores futuros proyectarse en la mónada de tener que ser aplicados para el valor futuro, cuando esté disponible, produciendo otro futuro que a su vez representa el resultado de esa función.

0

Los futuros también se utilizan en ciertos patrones de diseño, particularmente para patrones de tiempo real, por ejemplo, el patrón ActiveObject, que separa la invocación de método de la ejecución del método. El futuro está configurado para esperar la ejecución completa. Tiendo a verlo cuando necesitas moverte de un entorno multiproceso para comunicarte con un entorno de subproceso único. Puede haber instancias donde una pieza de hardware no tenga soporte de kernel para enhebrar, y los futuros se usan en esta instancia. A primera vista, no es obvio cómo se comunicaría, y sorprendentemente los futuros lo hacen bastante simple. Tengo un poco de código C#. Lo desenterraré y lo publicaré.

0

This blog post da una explicación detallada de junto con una explicación de junto con un ejemplo de cómo podría implementar un futuro usted mismo. Realmente lo recomiendo :)

+0

El enlace ya no funciona - Advertencia: crear un objeto predeterminado a partir de un valor vacío ... – mrwaim