Internos de los flujos de Kotlin. Para entender mejor las corrientes, debemos… | de Tushar Saha | diciembre 2022
Para comprender mejor los flujos, debemos revisar las funciones de suspensión y las corrutinas. Una función de suspensión es simple una función que se puede pausar y reanudar en un momento posterior. Como hace eso El compilador hace la magia aquí. El compilador simplemente toma el código que parece procedimental y lo convierte en devoluciones de llamada bajo el capó. La continuación es el objeto que realiza un seguimiento de dónde detenerse y dónde continuar. Digamos que tenemos el siguiente código con 2 puntos de suspensión. val a = a()val y = foo(a).await() // punto de suspensión #1b ()val z = bar(a, y).await() // punto de suspensión #2c(z) El compilador genera esto internamente Hay tres estados para este bloque de código:
- inicial (antes de cada punto de suspensión)
- después del primer punto de suspensión
- después del segundo punto de suspensión
clase
- Despachador.Predeterminado – para trabajos intensivos en CPU (por ejemplo, ordenar una lista grande)
- Despachadores.Principal – Esto depende de lo que haya agregado a las dependencias de tiempo de ejecución de su programa (por ejemplo, kotlinx-coroutines-android para el subproceso de interfaz de usuario en Android).
- despachadores Ilimitado – Ejecutar rutinas sin restricciones en cualquier subproceso específico
- Despachadores.IO – para trabajos pesados de E/S (por ejemplo, consultas de base de datos de larga duración)
Coroutine Scope es una forma de rastrear todas las rutinas que se ejecutan dentro de él. Cada rutina debe ejecutarse en el alcance. La concurrencia estructurada en las rutinas de Kotlin requiere que los desarrolladores siempre inicien las rutinas en el contexto de CoroutineScope o que especifiquen explícitamente que un alcance se define como una función de extensión en CoroutineScope y toma un CoroutineContext como parámetro, por lo que en realidad necesita dos contextos de rutina (ya que un alcance es solo una referencia está en un contexto). ¿Qué pasa con ellos? Los une con el operador más y crea una unión de conjunto de sus elementos. Se utiliza un flujo para la ilustración. una salida secuencial de valores que alguna vez termina (porque se acaba de forma natural o pasa algo malo). Todas las operaciones en un flujo se ejecutan secuencialmente dentro del mismo bloque de código (y por lo tanto el mismo ámbito de rutina). Detrás de escena, un flujo es solo una interfaz que expone un método para recopilar los valores devueltos: T)}flujo de interfaz