haskell concurrency parallel-processing deterministic non-deterministic

¿Por qué el haskell concurrente no es determinista mientras que los primitivos de haskell paralelos(par y pseq) son deterministas?



concurrency parallel-processing (2)

No entiendo muy bien el determinismo en el contexto de la concurrencia y el paralelismo en Haskell. Algunos ejemplos serían útiles. Gracias


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. Ejecutar acciones simultáneamente se llama concurrencia .

Como ejemplo, considere las dos acciones putStr "foo" y putStr "bar" . Dependiendo del orden en que se evalúen esas dos acciones, la salida es "foobar", "barfoo" o cualquier estado intermedio. El resultado es indeterminista ya que depende del orden específico de evaluación.

Como otro ejemplo, considere la sum [1..10] los dos valores sum [1..10] y 5 * 3 . Independientemente del orden en que esos dos sean evaluados, siempre se reducen a los mismos resultados. Este determinismo es algo que normalmente solo se puede garantizar con valores puros.


La concurrencia y el paralelismo son dos cosas diferentes.

La concurrencia significa que tiene múltiples hilos que interactúan de forma no determinista. Por ejemplo, puede tener un servidor de chat donde cada cliente es manejado por un hilo. El no determinismo es esencial para el sistema que estás tratando de modelar.

El paralelismo se trata de usar varios subprocesos 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 de forma secuencial.

Muchos idiomas no tienen primitivas para el paralelismo, por lo que tiene que implementarlo utilizando primitivas de concurrencia como hilos y bloqueos. Sin embargo, esto significa que usted, el programador, debe tener cuidado de asegurarse de no introducir accidentalmente el no determinismo no deseado u otros problemas de concurrencia. Con primitivos paralelismos explícitos como par y pseq , muchas de estas preocupaciones simplemente desaparecen.