¿Las corutinas son solo azúcar sintáctico para los manipuladores de finalización?
¿Las corutinas son solo azúcar sintáctico alnetworkingedor de los bloques de terminación y se crearán bloques de terminación debajo del capó? ¿O el concepto de corutinas es mucho más complejo y amplio que el truco del comstackdor, también conocido como azúcar sintáctica?
- ¿Cuál es la política de compatibilidad de Kotlin?
- Mapeo a less que la exception
- Cómo evitar que kotlin.Unit object sea eliminado por Proguard
- ¿Por qué aparece el error "No se encontraron descriptores de ensamblado" al crear este proyecto?
- EXCEPCIÓN FATAL: main KotlinNullPointerException
- Base de datos de android de Kotlin: no se puede convertir java.lang.String en android.database.Cursor
- Android: ¿cómo lograr setOnClickListener en Kotlin?
- solo se permiten classs en el lado izquierdo de una class literal
- Error al ejecutar un servlet de Apache Tomcat escrito en Kotlin
- ¿Cómo usar los methods Spring Data JPA que devuelven un Stream en un bloque try-with-resources en Kotlin?
- El complemento "kotlin-noarg" no funciona en el Reino
- Combinar / fusionar classs de datos en Kotlin
- Marque los parameters no utilizados en Kotlin
No es solo azúcar sintáctico, en absoluto. Las corutinas no bloquean los hilos, simplemente suspenden la ejecución, por lo tanto fomentan la progtwigción concurrente sin locking .
Las corutinas no dependen de las características del sistema operativo o la JVM (p. Ej., No están asignadas a Threads nativas). En cambio, las corutinas y las funciones de suspend
particular son transformadas por el comstackdor que produce una máquina de estados capaz de manejar suspensiones en general y que pasan suspendiendo corutinas manteniendo su estado. Esto está habilitado por Continuaciones , que se agregan como un parámetro para cada function suspendida por el comstackdor; esta técnica se llama "estilo de continuación de la continuidad".
Para más detalles, consulte https://github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines-informal.md
No, las corutinas no son azúcar sintáctico. Puedes pensar en corrutinas como en funciones que pueden interactuar con la persona que llama. Cuando llamas a una function normal, di que pasas el control a foo
y tienes que esperar hasta que foo
complete o arroje una exception. Las corutinas son funciones que pueden transferir el control a la persona que llama, y la persona que llama puede decidir si la coroutine debe continuar y cuándo y cómo debe continuar la coroutine. Esto le da la oportunidad de implementar cosas que son construcciones de lenguaje especiales en otros idiomas:
- Generadores (también conocidos como
yield
palabra key) como en C # y JavaScript. La persona que llama continúa la ejecución de coroutine cuando un usuario quiere un nuevo valor del iterador. Coroutine vuelve al llamador llamando a la functionyield()
, que también le transfiere cierto valor a la persona que llama. - Async / await como en C # y JavaScript. La persona que llama continúa la ejecución cuando se resuelve Futuro (similar a Tarea o Protable). Coroutine vuelve al llamador llamando a la function await
await()
. La persona que llama pasa el valor a coroutine cuando Future se resuelve y corutina observa este valor como resultado de la llamada awaitawait()
. - Goroutines / canales en Go.
A diferencia de C #, JavaScript o Go, Kotlin no implementa ninguna de estas características en la syntax especial. En cambio, Kotlin proporciona solo la syntax de suspend fun
, y luego usted mismo puede implementar estas características (u get una existente de la biblioteca correspondiente llamada kotlinx.coroutines
).
Te aconsejo que escuches lo que Chris Lattner (creador de Swift) count sobre los futuros models Swift Concurrency. Enlace: https://spec.fm/podcasts/swift-unwrapped/84323
a las 11:30 él dice:
Puedes pensar en async / await como azúcar sintáctico solo para los manejadores de finalización
- Combina Java con Kotlin en Android
- Función de tipo reificado de Kotlin como extensión de function. ¿Se puede invocar desde Java?