¿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?

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 function yield() , 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 await await() .
  • 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

  • Spring Boot: no puede include recurso estático
  • Cómo ejecutar la function Kotlin en Intellij Idea
  • ¿Cómo convertir el método de la class <T> #cast de Java a Kotlin?
  • El resultado es el mismo, pero el caso de testing no pasa en la testing unitaria
  • Agregar un oyente de deslizamiento a textView en Anko
  • Usar varios lenguajes JVM en el mismo proyecto
  • Android: no se puede agregar el jar creado en java8 con kotlin
  • ¿Cómo interactúa Kotlin con Java y JavaScript?
  • Constructor llama a kotlin usando vararg
  • Kotlin, JPA y @Transient
  • Kotlin Coroutines: ¿Necesitamos sincronizar el estado compartido?