¿Qué es una corrutina? ¿Cómo están relacionados con la concurrencia?¿Qué es una corrutina?
Respuesta
Coronetas y simultaneidad son en gran parte ortogonales. Las corutinas son una estructura de control general mediante la cual el control de flujo se transfiere cooperativamente entre dos rutinas diferentes sin retorno.
La sentencia 'yield' en Python es un buen ejemplo. Crea una corutina. Cuando se encuentra el 'rendimiento', se guarda el estado actual de la función y se devuelve el control a la función de llamada. La función de llamada puede entonces transferir la ejecución nuevamente a la función de rendimiento y su estado se restaurará al punto donde se encontró el 'rendimiento' y la ejecución continuará.
¿Cuál es la diferencia entre llamar a una función directamente y ceder el paso de una corutina al envolver esta función en esta corutina? –
Podría ser mejor explicar que estos dos conceptos no son realmente 'ortogonales' en este contexto. Definitivamente puede dibujar cómo los dos conceptos son similares entre sí. La idea de pasar el control entre dos o más cosas es muy similar. – steviejay
De Programming in Lua, "Coroutines
" sección:
Un co-rutina es similar a un hilo (en el sentido de múltiples hilos): es una línea de ejecución, con su propia pila, sus propias variables locales, y su propio puntero de instrucción; pero comparte variables globales y casi todo lo demás con otras corutinas. La principal diferencia entre hilos y corutinas es que, conceptualmente (o literalmente, en una máquina multiprocesador), un programa con hilos ejecuta varios hilos en paralelo. Las corutinas, por otro lado, son colaborativas: en un momento dado, un programa con corrutinas ejecuta solo una de sus corutinas, y esta corutina en ejecución suspende su ejecución solo cuando solicita explícitamente su suspensión.
Así que el punto es: Coroutines son "de colaboración". Incluso en el sistema multinúcleo, solo hay una corrutina ejecutándose en un momento dado (pero varios subprocesos pueden ejecutarse en paralelo). No hay apropiaciones preventivas entre corutinas, la corrutina en ejecución debe renunciar a la ejecución de forma explícita.
Por "concurrency
", se puede hacer referencia de slide Rob Pike:
concurrencia es la composición de los cálculos que ejecutan de forma independiente.
Así que durante la ejecución de un co-rutina, se pasa el control al corrutina B. A continuación, después de algún tiempo, la co-rutina B pasa el control al corrutina A. Puesto que no es dependencia entre corrutinas, y deben funcionar en conjunto, por lo tanto, las dos corutinas son , no concurrencia.
Me encantaba esta respuesta hasta que llegué a la última oración. Qué significa eso? ¿Escribiste mal la "concurrencia"? Si es así, esa conclusión no parece coincidir con la definición proporcionada. ¿O es eso una nueva palabra "concurreny"? ¿Qué significa esa palabra? –
@ ErickG.Hagstrom: Lo siento, escribí 'concurrencia' mal. ¿Por qué crees que la conclusión no parece coincidir con la definición proporcionada? –
Corutinas no se ejecutan de forma independiente. Se turnan, cada uno esperando que el otro haga una parte del trabajo. Se coordinan activamente entre ellos. Eso es lo opuesto a la definición de concurrencia de Rob Pikes. –
Coroutine es similar a subroutine/threads. La diferencia es que una vez que una persona que llama invocó una subrutina/subprocesos, nunca volverá a la función de llamante. Pero una corrutina puede regresar a la persona que llama después de ejecutar unos pocos códigos que le permiten ejecutar su propio código y regresar al punto de corrutina donde detuvo la ejecución y continuar desde allí. es decir. Un corrutina tiene más de un punto de entrada y salida
En una nota diferente, en Python gevent
biblioteca es una biblioteca de red basada coroutine
que le da características filiformes como las solicitudes de red asíncrona, sin la sobrecarga de crear y destruir hilos. La biblioteca coroutine
utilizada es greenlet
.
- corrutinas son grandes características disponibles en Kotlin idioma
- corrutinas son una nueva forma de escritura asíncrona, sin bloqueo código (y mucho más)
- Coroutine son hilos de peso ligero. Un hilo ligero significa que no se asigna en el hilo nativo, por lo que no requiere el cambio de contexto en el procesador, por lo que son más rápidos.
- no se asigna en el hilo nativo
- Coroutines y los hilos son multitareas. Pero la diferencia es que los hilos son administrados por el sistema operativo y coroutines por los usuarios.
Básicamente, hay dos tipos de corrutinas:
- Stackless
- Stackful
Kotlin implementa corrutinas Stackless - es decir que los corrutinas no tienen propia pila, por lo que no se asignan en el hilo nativo.
Estas son las funciones para iniciar la co-rutina:
launch{}
async{}
Puede obtener más información desde aquí:
https://www.kotlindevelopment.com/deep-dive-coroutines/
https://blog.mindorks.com/what-are-coroutines-in-kotlin-bf4fecd476e9
- 1. ¿Qué son casos de uso para una corrutina?
- 2. generador de Python, no tragar excepción en 'corrutina'
- 3. ¿Qué es una ObjectMother?
- 4. ¿Qué es una corriente?
- 5. ¿Qué es una subclase
- 6. ¿Qué es una proyección?
- 7. ¿Qué es una unión?
- 8. ¿Qué es una "Unidad"?
- 9. ¿Qué es y qué no es una historia de usuario?
- 10. ¿Qué es una interfaz fluida?
- 11. ¿Qué es una actualización http?
- 12. ¿Qué es una consulta ilimitada?
- 13. MySQL: ¿Qué es una página?
- 14. BDD, ¿qué es una función?
- 15. ¿Qué es una pila LAMP?
- 16. C++: ¿Qué es una secuencia
- 17. ¿Qué es una gema Ruby?
- 18. ¿Qué es una instrucción JVM?
- 19. ¿Qué es una matriz dentada?
- 20. ¿Qué es una clase parcial?
- 21. ¿Qué es una clave "opaca"?
- 22. ¿Qué es una API "conectable"?
- 23. ¿Qué es una actualización destructiva?
- 24. ¿Qué es exactamente una "Consola"?
- 25. ¿Qué es exactamente una ROM?
- 26. ¿Qué es una interfaz privada?
- 27. ¿Qué es una implementación concreta?
- 28. ¿Qué es una emisión fija?
- 29. ¿Qué es una colección java?
- 30. ¿Qué es una "transacción distribuida"?
código concurrente no tiene necesariamente tiene que funcionar en "paralelo" (no introduzcamos nuevos términos). – user1712447
He escrito una biblioteca de coroutine con C estándar, que admite los mensajes select/poll/eplll/kqueue/iocp/Win GUI para Linux, BSD y Windows. Es un proyecto de código abierto en https://github.com/acl-dev/libfiber. El consejo será bienvenido –