No entiendo completamente el determinismo en el contexto de concurrencia y paralelismo en Haskell. Algunos ejemplos serían útiles. Gracias¿Por qué el haskell concurrente no es determinista, mientras que las primitivas de haskell paralelas (par y pseq) son deterministas?
Respuesta
Cuando se trata de valores puros, el orden de evaluación no importa. Eso es esencialmente lo que hace el paralelismo : Evaluar valores puros en paralelo. A diferencia de los valores puros, el orden suele ser importante para las acciones con efectos secundarios. La ejecución de acciones simultáneamente se llama concurrencia . Como ejemplo, considere las dos acciones putStr "foo"
y putStr "bar"
. Según el orden en que se evalúen esas dos acciones, la salida es "foobar", "barfoo" o cualquier estado intermedio. La salida es indeterminista ya que depende del orden específico de evaluación.
Como otro ejemplo, considere los dos valores sum [1..10]
y 5 * 3
. Independientemente del orden en que esos dos se evalúan, siempre reducen a los mismos resultados. Este determinism es algo que generalmente solo puede garantizarse con valores puros.
La simultaneidad y el paralelismo son dos cosas diferentes.
Concurrencia significa que tiene múltiples hilos que interactúan de manera no determinista. Por ejemplo, es posible que tenga un servidor de chat donde cada cliente se maneja con un hilo. El no determinismo es esencial para el sistema que está tratando de modelar.
Paralelismo se trata de utilizar múltiples hilos para simplemente hacer que su programa se ejecute más rápido. Sin embargo, el resultado final debe ser exactamente el mismo que si ejecuta el algoritmo secuencialmente.
Muchos idiomas no tienen primitivas para el paralelismo, por lo que debe implementarlo utilizando primitivas de simultaneidad como subprocesos y bloqueos. Sin embargo, esto significa que usted, el programador, debe tener cuidado para asegurarse de que no introduzca accidentalmente no determinismo no deseado u otros problemas de concurrencia. Con primitivas explícitas de paralelismo como par
y pseq
, muchas de estas preocupaciones simplemente desaparecen.
Eso es ... una * realmente * buena explicación. Gracias. –
- 1. sobre 'PSEQ' en Haskell
- 2. concurrencia Haskell - ¿es forkIO realmente no determinista?
- 3. Cómo utilizar las estrategias paralelas en Haskell
- 4. Haskell: ¿Por qué `par` se definió tal como era?
- 5. Par Haskell y funciones de desvinculación
- 6. ¿Por qué Haskell es tan grande?
- 7. ¿Por qué este código Haskell no termina?
- 8. ¿El mapa de Haskell no es flojo?
- 9. ¿Qué es "levantar" en Haskell?
- 10. ¿Qué es esta sintaxis haskell?
- 11. ¿Por qué el Data.Set de Haskell no admite conjuntos infinitos?
- 12. Programación multinúcleo en Haskell - Control.Parallel
- 13. ¿Qué es [] (constructor de lista) en Haskell?
- 14. ¿Por qué ListAppend no es destructivo, mientras que ArrayAppend y StructInsert son ambos destructivos?
- 15. En Haskell, ¿por qué los patrones no exhaustivos no son errores en tiempo de compilación?
- 16. Haskell: ¿Por qué este tipo de verificación?
- 17. Haskell: ¿Por qué no hay desajuste de tipo (y por qué compila esto)?
- 18. ¿Qué son los "patrones n + k" y por qué están prohibidos en Haskell 2010?
- 19. ¿Cuán difícil es el multihilo de Haskell?
- 20. ¿Los patrones aritméticos son legales Haskell?
- 21. ¿Por qué debería querer aprender Haskell?
- 22. ¿Por qué no puedo agregar Integer to Double en Haskell?
- 23. Haskell: ¿Es un desastre?
- 24. Listas definidas como ¿Tal vez en Haskell? Por qué no?
- 25. ¿Cuán paralelas son las pruebas paralelas en Ruby 1.9.3?
- 26. ¿Por qué Haskell no tiene una sola tupla de elemento?
- 27. ¿Por qué es tan simple este algoritmo haskell tan lento?
- 28. ¿Por qué esta expresión de Haskell es tan lenta?
- 29. Haskell "no" tipo restricción
- 30. Haskell - ¿Qué es Control.Applicative.Alternative good for?
+1; en otras palabras, el paralelismo es una optimización; concurrencia cambia semántica. – ehird
@ehird Sí. Eso es perfectamente lo que traté de transmitir. – fuz
In lang oz: 1 valor de flujo de datos solo puede vincularse una vez 2 El valor de desvinculación del uso del programa debe esperar hasta que se haya vinculado. Entonces, el comportamiento es determinante cuando dos subprocesos usan un mismo valor de flujo de datos. – jiamo