Pregunta

Tanto los futuros y las promesas bloquean hasta que se han calculado sus valores, por lo cual es la diferencia entre ellos?

¿Fue útil?

Solución

Contestación en términos de Clojure, he aquí algunos ejemplos de de Sean Devlin screencast :

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

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

Tenga en cuenta que en la promesa va a entregar de forma explícita un valor que seleccione en un cálculo posterior (:fred en este caso). El futuro, por el contrario, se consume en el mismo lugar que fue creado. El some-expr es de suponer que lanzó detrás de las escenas y se calcula en tándem (con el tiempo), pero si permanece sin evaluar el momento en que se accede a las secuencias de roscado hasta que esté disponible.


editado añadir

Para ayudar a distinguir además entre una promesa y un futuro, tenga en cuenta lo siguiente:

prometer

  1. Se crea un promise. Ese objeto promesa ahora se puede pasar a cualquier tema.
  2. Se continúa con los cálculos. Estos cálculos pueden ser muy complicado que implica efectos secundarios, la descarga de datos, la entrada del usuario, acceso a bases de datos, otras promesas - lo que quiera. El código se parecen mucho a su código de línea principal en cualquier programa.
  3. Cuando haya terminado, puede deliver los resultados a ese objeto promesa.
  4. Cualquier artículo que trata de deref su promesa antes de que haya terminado con su cálculo se bloqueará hasta que haya terminado. Una vez que haya terminado y que ha delivered la promesa, la promesa no bloqueará por más tiempo.

futuro

  1. Usted crea su futuro. Parte de su futuro es una expresión para el cálculo.
  2. El futuro puede o no puede ejecutar simultáneamente. Se podría asignar un hilo, posiblemente de una piscina. Sólo podía esperar y no hacer nada. Desde su punto de vista No se puede decir .
  3. En algún momento (o en otro hilo) derefs el futuro. Si el cálculo ya se ha completado, se obtienen los resultados de la misma. Si aún no lo ha completado, se bloqueará hasta que tiene. (Es de suponer que si no ha comenzado todavía, derefing significa que se comienza a ejecutar, pero esto, también, no está garantizada.)

Mientras que podría que la expresión en el futuro tan complicado como el código que sigue a la creación de una promesa, es dudoso que es deseable. Esto significa que los futuros son realmente más adecuado para cálculos rápidos, fondo-poder, mientras que las promesas son realmente más adecuadas para grandes rutas de ejecución, complicado. También, promesas parece, en términos de cálculos disponibles, un poco más flexible y orientada hacia el creador promesa de hacer el trabajo y el otro hilo recogiendo la cosecha. Futuros están más orientados hacia el inicio automático de una rosca (sin la sobrecarga feo y propenso a errores) y pasando con otras cosas hasta que - el hilo originario -. Necesidad los resultados

Otros consejos

Tanto futuro y promesa son mecanismos para comunicarse resultado de asíncrona cómputo del productor al consumidor (s).
En caso de Futuro cómputo se define en el momento de la creación y ejecución asíncrono futuro comienza "lo antes posible". También "sabe" cómo desovar un cálculo asíncrono.
En caso de Promise la cálculo , su hora de inicio y [posible] asíncrono invocación están desacoplados desde el mecanismo de entrega . Cuando cómputo resultado está disponible productor debe llamar deliver explícitamente, lo que también significa que los controles de productores cuando Resultado de la que se disponga.
Para Las promesas Clojure comete un error de diseño mediante el uso de un mismo objeto (resultado de la llamada promise) a ambos productos (deliver) y consumir (deref) el resultado de cómputo . Estos son dos capacidades muy distintas y deben ser tratados como tal.

Ya hay excelentes respuestas de modo que sólo la adición de la "Cómo usar" Resumen:

Tanto

Creación promesa o futuros devuelve una referencia inmediata. Esto bloquea de referencia sobre @ / DEREF hasta que el resultado de cálculo es proporcionado por otro hilo.

Futuro

Al crear el futuro que proporcione un trabajo sincrónica que va a hacer. Se ejecuta en un hilo de la piscina sin límites dedicado.

Promise

No dar argumentos al crear promesa. La referencia debe ser pasado a otro hilo 'usuario' que deliver el resultado.

En primer lugar, un Promise es un Future. Creo que quiere saber la diferencia entre un Promise y una FutureTask.

A Future representa un valor que no se conoce actualmente, pero se dará a conocer en el futuro.

A FutureTask representa el resultado de un cálculo que va a ocurrir en el futuro (tal vez en algún grupo de subprocesos). Al intentar acceder al resultado, si el cálculo no ha sucedido todavía, bloquea. De lo contrario, el resultado se devuelve inmediatamente. No hay ninguna otra parte implicada en el cálculo de los resultados como el cálculo se especifica por adelantado.

A Promise representa un resultado que será entregado por el prometedor para la promisee en el futuro. En este caso usted es el destinatario de la promesa y el prometedor es que uno que le dio el objeto Promise. Al igual que en el FutureTask, si intenta acceder al resultado antes se ha cumplido el Promise, éste se bloquea hasta que el prometedor cumple la Promise. Una vez satisfechos los Promise, se obtiene el mismo valor siempre y de inmediato. A diferencia de un FutureTask, hay una otra parte involucrada aquí, uno que hizo que el Promise. Que otra parte es responsable de hacer el cálculo y el cumplimiento de la Promise.

En ese sentido, un FutureTask es un Promise usted hizo a sí mismo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top