learn golang for example coroutines multithreading go goroutine

multithreading - golang - goroutine timeout



¿Es una goroutine de Go una corutina? (4)

Goroutine es un "hilo" de ejecución separado. Es IMO realmente no comparable a una coroutine. En la primera aproximación, los goroutines pueden implementarse mediante hilos de sistema operativo reales . AFAIK, ese fue el caso de las primeras versiones de gccgo. Otra diferencia es que los goroutines pueden ser eliminados.

Los compiladores de Go actuales implementan rutinas como "hilos" de espacio de usuario muy livianos. Una característica distinta wrt a, por ejemplo. Green Threads es que los goroutines pueden cambiar a diferentes subprocesos del sistema operativo.

Creo que aquí puede encontrar algunos proc.c relacionados de interés: proc.c

En la presentación de Google I / O 2012 Go Concurrency Patterns , Rob Pike menciona que varios goroutines pueden vivir en un hilo. ¿Esto implica que se implementan como coroutines ? Si no, ¿cómo se implementan? Los enlaces al código fuente serían bienvenidos.


No exactamente. La sección de Preguntas frecuentes de Go ¿Por qué goroutines en lugar de hilos? explica:

Los goroutines son parte de hacer que la concurrencia sea fácil de usar. La idea, que ha existido por un tiempo, es multiplexar de forma independiente la ejecución de funciones -corutinas- en un conjunto de hilos. Cuando una coroutine bloquea, como al llamar a una llamada al sistema de bloqueo, el tiempo de ejecución mueve automáticamente otras coroutines en la misma hebra del sistema operativo a una hebra diferente y ejecutable para que no se bloqueen. El programador no ve nada de esto, que es el punto. El resultado, que llamamos rutinas, puede ser muy barato: a menos que pasen mucho tiempo en las llamadas al sistema de larga ejecución, cuestan poco más que la memoria para la pila, que es solo unos pocos kilobytes.

Para hacer las pilas pequeñas, el tiempo de ejecución de Go usa pilas segmentadas. Una goroutine recién acuñada recibe algunos kilobytes, que casi siempre es suficiente. Cuando no lo es, el tiempo de ejecución asigna (y libera) segmentos de extensión automáticamente. Los promedios generales sobre tres instrucciones baratas por llamada de función. Es práctico crear cientos de miles de goroutinas en el mismo espacio de direcciones. Si los goroutines son solo hilos, los recursos del sistema se agotarían en un número mucho más pequeño.


OMI, una corutina implica el apoyo de medios explícitos para transferir el control a otra corutina. Es decir, el programador programa una corutina de una manera cuando decide cuándo una corutina debe suspender la ejecución y pasar su control a otra corutina (ya sea llamándola o volviendo / saliendo (normalmente llamada ceder).

Los "goroutines" de Go son otra cosa: implícitamente ceden el control en ciertos puntos indeterminados 1 que suceden cuando el goroutine está a punto de dormir con algún recurso (externo) como E / S, canalización, etc. Este enfoque se combina con el estado compartido a través de canales permite al programador escribir la lógica del programa como un conjunto de procesos secuenciales de peso liviano que elimina el problema del código de spaghetti común tanto para los enfoques basados ​​en corutinas como para los basados ​​en eventos.

En cuanto a la implementación, creo que son bastante similares a la (desafortunadamente no muy conocida) biblioteca de "State Threads" , solo un nivel bastante inferior (ya que Go no confía en libc o cosas como esta y habla directamente con el Kernel OS) - podría leer el documento introductorio para la biblioteca ST donde el concepto está bastante bien explicado.

1 De hecho, estos puntos son menos determinados que los de las corutinas pero más determinados que con los verdaderos subprocesos del sistema operativo en la multitarea preventiva , donde cada subproceso puede ser suspendido por el kernel en cualquier momento dado y en el flujo del control del subproceso.