DEV Community

GoyesDev
GoyesDev

Posted on

[SC] AsyncStream y AsyncThrowingStream

Preguntas

¿Qué es un AsyncStream y en qué se diferencia de un AsyncThrowingStream?

Un AsyncStream es un AsyncSequence que puede emitir eventos de progreso y fin con base en un AsyncStream.Continuation.

Es muy parecido a un Publisher de Combine, con la diferencia que solo admite un suscriptor.

AsyncThrowingStream es la versión que arroja error de AsyncStream.

¿Por qué podría querer reemplazar un closure de progreso/completación con un AsyncThrowingStream?

Facilita la integración del API de async/await en lugar de una integración basada en closures. Además, AsyncStream permite poder iterar con for try await en lugar de anidar closures, lo que hace el flujo más lineal y legible.

¿Qué sucede si no se llama a continuation.finish() al terminar un stream?

La implementación se va a quedar colgada sin terminar. El código que itera el stream con for try await nunca avanza más allá del loop porque el stream nunca emite el evento de terminación.

¿Qué son las buffer policies y cuándo tendría sentido usar cada una?

Las "buffer policies" define qué hacer con los valores emitidos cuando no hay ningún consjmidor leyendo aún. Es decir: regulan el buffer previo a la lecutra, no a la entrega en tiempo real. En el artículo se mencionan:

¿En qué se diferencia un AsyncStream de un publisher de Combine?

El Publisher de Combine puede tener varios suscriptores. El AsyncStream solo puede tener uno.

¿Cómo se usa el continuation para enviar valores, manejar errores y terminar el stream?

Sobre el continuation se pueden usar los siguientes métodos:

  • yield(with:): Para emitir un elemento de tipo Result<Element,Never> en unAsyncStream`.
  • yield(with:): Para emitir un elemento de tipo Result<Element,Failure> en un AsyncThrowingStream`.
  • finish(): Para cerrar el Stream sin emitir error.
  • finish(throwing:): Para cerrar el Stream emitiendo un error
  • onTermination: Suscribe un closure para ejecutar algún trabajo cuando termina el stream. Este sirve para hacer labores de limpieza o depuración.

¿Qué hace el callback onTermination y para qué casos de uso es útil?

Suscribe un closure para ejecutar algún trabajo cuando termina el stream. Este sirve para hacer labores de limpieza o depuración.

¿Cómo y cuándo se cancela un stream, y qué efecto tiene la cancelación?

Un Stream se cancela cuando el contexto asíncrono que lo envuelve es cancelado (e.g. Task.cancel()).

El stream se termina (no en error, ni en success), sino que se invoca onTermination con la causa (i.e. "termination reason: cancelled")

No hay forma de cancelar el stream explícitamente, solo de forma indirectamente a través del Task que lo envuelve.

¿Por qué no es seguro tener múltiples consumidores de un mismo AsyncStream?

Como solo puede tener un suscriptor, no se sabe a cuál le va a entregar el valor. Los valroes se reparten entre los consumidores en lugar de duplicarse - Cada valor lo recibe uno solo, de forma impredecible.


Recordar sin mirar el texto

Explica con tus propias palabras el ciclo de vida de un AsyncThrowingStream, desde su creación hasta su terminación.

¿Cuáles son las tres razones posibles por las que un stream puede terminar y cómo se reporta cada una?

Sin mirar el código, describe cómo transformarías el FileDownloader basado en closures a uno basado en AsyncThrowingStream.


Revisión y conexión de ideas

¿En qué escenarios concretos de tu propio código usarías un AsyncStream en lugar de Combine o callbacks?

¿Cuál es la limitación más importante de AsyncStream mencionada en el artículo y cómo se puede mitigar?

¿Qué errores de programación comunes advierte el artículo y qué estrategias propone para detectarlos?


Bibliografía

Top comments (0)