¿Qué son los futuros? Tiene algo que ver con la evaluación perezosa.¿Qué son los futuros?
Respuesta
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.
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.
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
@ 012 ...: Verifique los enlaces que publiqué, dan una buena descripción de los futuros. –
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
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); }));
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
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.
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é.
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 :)
El enlace ya no funciona - Advertencia: crear un objeto predeterminado a partir de un valor vacío ... – mrwaim
- 1. ¿Por qué mis futuros scala no son más eficientes?
- 2. ¿Qué son los RFC?
- 3. ¿Qué son los conceptos?
- 4. DAL futuros de prueba
- 5. entendiendo Clojure futuros
- 6. Futuros en Haskell
- 7. ¿Futuros para Objective-C?
- 8. ¿Qué son los objetos anclados?
- 9. ¿Qué son los objetos diferidos?
- 10. ¿Qué son los archivos NDF?
- 11. ¿Qué son los métodos virtuales?
- 12. ¿Qué son los zócalos Async?
- 13. ¿Qué son los operadores levantados?
- 14. ¿Qué son los índices hipotéticos?
- 15. ¿Qué son los archivos .S?
- 16. ¿Qué son los objetos inmutables?
- 17. ¿Qué son los idiomas ISO?
- 18. Posible error en Scala 2.10: los futuros no se ejecutan
- 19. `DummyExecutor` para 'futuros' de Python
- 20. ¿Por qué los vectores son tan superficiales?
- 21. ¿Qué son los objetos de matrices vértice?
- 22. ¿Qué son los modificadores transitorios y volátiles? -
- 23. ¿Qué son exactamente los metadatos en SQLAlchemy?
- 24. ¿Qué son exactamente los recursos no administrados?
- 25. Scala: ¿Por qué los actores son livianos?
- 26. ¿Por qué son importantes los árboles binarios?
- 27. ¿Qué son los servicios de WCF RIA?
- 28. ¿Qué son los operadores bit a bit?
- 29. ¿Qué son los métodos anónimos en C#?
- 30. Determinar qué bloqueos son los más disputados?
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
¡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