corrutinas Lua no son lo mismo que las discusiones en el sentido de sistema operativo.
Los subprocesos del sistema operativo son preventivos. Eso significa que se ejecutarán en tiempos arbitrarios, robando timeslices como lo dicta el sistema operativo. Se ejecutarán en diferentes procesadores si están disponibles. Y pueden funcionar al mismo tiempo siempre que sea posible.
Lua coroutines no hacen esto. Coroutines puede tener el tipo "hilo", pero solo puede haber una sola corutina activa a la vez. Se ejecutará una corrutina hasta que la corutina en sí misma decida dejar de ejecutarse emitiendo un comando coroutine.yield
. Y una vez que ceda, no se ejecutará nuevamente hasta que otra rutina emita un comando coroutine.resume
a esa corutina en particular.
corrutinas Lua proporcionan cooperativa multihilo, y por eso se les llama co rutinas. Cooperan entre ellos. Solo se ejecuta una cosa a la vez, y solo cambia las tareas cuando las tareas dicen explícitamente que lo haga.
Puede pensar que podría simplemente crear subprocesos de sistema operativo, crear algunas corutinas en Lua, y luego resumir cada una en una secuencia de sistema operativo diferente. Esto funcionaría siempre que cada subproceso del sistema operativo ejecutara el código en un Lua diferente instance
. La API de Lua es reentrante; se le permite llamar desde diferentes subprocesos del sistema operativo, pero solo si está llamando desde diferentes instancias de Lua. Si intentas realizar múltiples subprocesos a través de la misma instancia de Lua, es probable que Lua haga cosas desagradables.
Todos los módulos de subprocesamiento Lua que existen crean instancias de Lua alternativas para cada subproceso. Lua-lltreads hace una instancia de Lua completamente nueva para cada hilo; no hay API para la comunicación de hilo a hilo fuera de los parámetros de copia que se pasan al nuevo hilo. LuaLanes proporciona algún código de conexión cruzada.