2009-02-16 40 views
97

¿Qué es una corrutina? ¿Cómo están relacionados con la concurrencia?¿Qué es una corrutina?

+0

código concurrente no tiene necesariamente tiene que funcionar en "paralelo" (no introduzcamos nuevos términos). – user1712447

+0

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 –

Respuesta

80

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á.

+9

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

+1

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

29

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.

+0

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

+0

@ ErickG.Hagstrom: Lo siento, escribí 'concurrencia' mal. ¿Por qué crees que la conclusión no parece coincidir con la definición proporcionada? –

+0

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. –

6

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

1

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.

0
  • 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:

  1. Stackless
  2. 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