2011-06-17 11 views
5

No he podido escribir un programa en Lua que cargue más de una CPU. Desde Lua supports the concept via coroutines, creo que es posible.Lua :: ¿Cómo escribir un programa simple que cargará múltiples CPU?

razón para que yo fallando puede ser uno de:

  • No es posible en Lua
  • No soy capaz de escribirlo ☺ (y yo esperanza es el caso)

¿Puede alguien más con experiencia (descubrí Lua hace dos semanas) señalarme en la dirección correcta?


The point is to write a number-crunching script that does hi-load on ALL cores... Para fines demostrativos de poder de Lua.

Gracias ...

Respuesta

7

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.

6

No es posible con las bibliotecas del núcleo de Lua (si no se cuenta la creación de múltiples procesos y la comunicación a través de entrada/salida), pero creo que hay enlaces de Lua para diferentes bibliotecas de roscado allí afuera.

El answer from jpjacobs to one of the related questions enlaces a LuaLanes, que parece ser una biblioteca multihilo. (No tengo experiencia, sin embargo).

Si incrusta Lua en una aplicación, normalmente querrá tener el multihilo de alguna manera vinculado a sus aplicaciones multihilo.

2

Además de LuaLanes, echar un vistazo a llthreads

1

Además de LuaLanes, llthreads y otras cosas ya mencionadas here, hay una manera más simple.

Si está usando el sistema POSIX, intente hacerlo a la antigua usanza con posix.fork() (desde luaposix). Ya sabes, divide la tarea en lotes, bifurca la misma cantidad de procesos que la cantidad de núcleos, calcula los números, ordena los resultados.

Además, asegúrese de estar utilizando LuaJIT 2 para obtener la velocidad máxima.

0

Es muy fácil simplemente crear múltiples intérpretes Lua y ejecutar programas lua dentro de todos ellos.

Lua multihebra es un modelo de nada compartido. Si necesita intercambiar datos, debe serializar los datos en cadenas y pasarlos de un intérprete al otro con extensión c o sockets o cualquier tipo de IPC.

0

La serialización de datos a través de mecanismos de transporte similares a IPC no es la única forma de compartir datos entre subprocesos.

Si está programando en un lenguaje orientado a objetos como C++, es posible que varios subprocesos accedan a los objetos compartidos a través de subprocesos mediante punteros a objetos, no es seguro hacerlo, a menos que proporcione algún tipo de garantía de que no hay dos hilos intentarán leer y escribir simultáneamente en los mismos datos.

Existen muchas opciones para hacer eso, los mecanismos sin llave y sin esperar son cada vez más populares.

Cuestiones relacionadas