Async Flashcards
Qué es una tarea asincrónica? Cuándo suelen preferirse las tareas asincrónicas?
Una tarea asincrónica es una función que se denomina con el keyword async
, mucho más liviana que un thread, y que se utiliza para intercalar tareas de bajo cómputo en un único thread o en un pool de threads.
Conviene utilizar tareas asincrónicas cuando se necesita realizar muchas operaciones de Input/Output (bajo cómputo), donde la tarea principalmente se queda esperando una respuesta, pero el programa puede continuar incluso sin que se haya recibido la respuesta aún.
En qué se diferencian las tareas asincrónicas con los threads? Dar ventajas y desventajas de cada uno.
Las tareas asincrónicas son más livianas que los threads, y están pensadas para llamarse cuando se tiene una operación de Input/Output, que implica una llamada y esperar a que se retorne la respuesta.
Esto es porque los threads son más pesados en comparación, y no vale la pena spawnearlos cuando solamente van a realizar una llamada a una API. A su vez, no se puede tener tantos en un mismo programa, el overhead que implican comienza a sobrepasar los beneficios de tenerlos.
Con eso dicho, el task no es un nuevo hilo, sino que se ejecutan en un solo hilo (o pool de hilos), por lo que agregan lógica y cómputo en un task en realidad no mejora la performance.
Por lo tanto, la ventaja de los tasks es que, al ser más livianos, se pueden tener miles sin problemas. La desventaja es que no son útiles para ejecutar cómputo en paralelo o de manera concurrente; sólo sirven para permitir que el hilo principal no se quede trabado realizando una operación de I/O y poder realizar muchas en el mismo programa de manera concurrente.
Explicar método block_ok. Es lo mismo que await?
El método block_on es una función que permite ejecutar una función asincrónica y “convertirla” en sincrónica. Permite esperara a que se termine de ejecutar antes de continuar. Es la conexión entre el mundo asincrónico y el sincrónico.
Cuidado al usarla con tasks, ya que block_on bloquea todo el thread, no solamente el task.
Qué pasa si no se ejecuta el await de una tarea asincrónica?
Rust es lazy, por lo que spawnear un thread o una task asincrónica no implica ejecutarla. Recién cuando se llama al await es cuando se comienza a ejecutar el código.
Comparar el modelo de tareas asincrónicas con el modelo fork-join.
Modelo async:
- Pensado para paralelizar los llamados a APIs y operaciones de I/O
- Se basa en utilizar tareas asincrónicas, entidades más livianas que los threads
- Al ser más livianos, se pueden tener miles en el mismo programa
- No provee mejoras en costo o complejidad a la hora de ejecutar código de alto cómputo, el modelo no está pensado para eso
Modelo fork-join
- Implica dividir el problema principal en subtareas independientes, ejecutarlas en paralelo, y luego unir los resultados
- Como requisito, las subtareas generadas deben ser independientes entre sí
- Utiliza threads para la ejecución en paralelo
- Pensado para escenarios donde las tareas implican un alto nivel de cómputo
Explicar concepto de Future y Poll en Rust
Un future es una entidad que contiene todo lo necesario para que se ejecute la tarea asincrónica. Representa una operación asíncrona que eventualmente producirá un resultado.
Internamente utiliza el método Poll para verificar si la función asincrónica terminó de ejecutarse, con el método piñata. En este escenario, el future implementa un loop que le pide a Poll el estado actual de función asincrónica. Poll retorna al instante Ready con el resultado de la operación o Pending si la operación todavía no se completó. Eventualmente, Poll retorna Ready y el future devuelve ese resultado, completándose así la ejecución de la función asincrónica.