scala concurrency io scalaz

¿Cuál es la diferencia entre Task y IO en Scalaz?



concurrency (1)

Estos dos tipos de Scalaz

parece muy similar conceptualmente Ambos:

  • Representar un cálculo potencialmente secundario
  • Producir un resultado de éxito ( A ) o error ( Exception )
  • Tener instancias de Monad
  • Se puede desenvolver de manera insegura con run or unsafePerformIO

¿Cómo difieren? ¿Por qué ambos existen?


La diferencia básica es que IO simplemente demora la ejecución de algo pero lo hace dentro de un hilo actual. La tarea, por otro lado, es capaz de ejecutar algo al mismo tiempo (por lo tanto, el ExecutorService implícito).

Además, Task lleva la semántica del futuro de Scalaz (futuro que es más compostable que la versión clásica de Scala; futuro que le permite tener un mayor control de concurrencia haciendo bifurcación explícitamente definida y no ejecutar tareas en paralelo apenas se crea una instancia). Además, si lees la fuente del futuro de scalaz, te indicará Tarea como una versión más robusta que se puede usar en prod.

Por último, tenga en cuenta que intentar la ejecución de la tarea devuelve / / [Throwable, A] mientras que la forma de onda insegura de IO simplemente devuelve A. Esto habla de un tratamiento más robusto de los escenarios de error de la vida real.

Por lo que yo sé, en todas partes se usaría IO para componer los efectos, se usaría Tarea en la base de código de producción real.

Aquí hay una buena publicación en el blog sobre el uso de Tareas: Tarea de Tim Perrett