Lua :: Wie schreiben Sie einfachen Programm, laden mehrere CPUs?
Ich habe nicht in der Lage ein Programm zu schreiben, in Lua, die Last mehr als einer CPU. Da Lua das Konzept unterstützt über Coroutinen, ich glaube, es ist machbar.
Grund für mich scheitern kann sein:
- Es ist nicht möglich in Lua
- Ich bin nicht in der Lage, es zu schreiben ☺ (und ich hoffe es der Fall )
Kann jemand mehr Erfahrung (ich entdeckte Lua vor zwei Wochen) Punkt mich in richtige Richtung?
The point is to write a number-crunching script that does hi-load on ALL cores...
Für demonstrative Zwecke der macht der Lua.
Dank...
InformationsquelleAutor DinGODzilla | 2011-06-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lua Coroutinen sind nicht dasselbe wie die threads in das Betriebssystem Sinn.
OS-threads sind preemptiv. Das bedeutet, dass Sie ausgeführt werden, zu beliebigen Zeitpunkten, zu stehlen timeslices als diktiert durch das OS. Sie laufen auf unterschiedlichen Prozessoren, wenn Sie verfügbar sind. Und Sie können gleichzeitig ausgeführt werden, wo möglich.
Lua Coroutinen nicht zu tun. Coroutinen können den Typ "thread", aber es kann immer nur eine einzelne koroutine aktiv auf einmal. Eine koroutine ausgeführt werden, bis der coroutine selbst entscheidet, zu beenden, durch die Abgabe einer
coroutine.yield
Befehl. Und sobald es sich ergibt, es wird nicht erneut ausgeführt, bis eine andere routine-Probleme eincoroutine.resume
Befehl, dass insbesondere coroutine.Lua Coroutinen bieten Genossenschaft multithreading, das ist, warum Sie genannt werden coRoutinen. Sie kooperieren mit einander. Nur eine Sache läuft in einer Zeit, und Sie nur die Aufgaben wechseln, wenn die Aufgaben explizit sagen, dies zu tun.
Denken Sie vielleicht, Sie könnte einfach erstellen OS-threads, erstellen einige Coroutinen in Lua, und dann einfach fortsetzen, jeder in einer anderen OS-thread. Dies würde so lange arbeiten, wie jedes OS-thread ausführen von code in einer anderen Lua Instanz. Die Lua-API ist reentrant; Sie dürfen anrufen, es von verschiedenen OS-threads, aber nur wenn der Aufruf von anderen Lua-Instanzen. Wenn Sie versuchen, Multi-Thread über das gleiche Lua-Instanz, Lua wird wahrscheinlich unangenehme Dinge.
Alle Lua-threading-Module, die existieren, erstellen von alternativen Lua-Instanzen für jeden thread. Lua-lltreads macht einfach eine völlig neue Lua-Instanz für jeden thread; es gibt keine API für die thread-zu-thread-Kommunikation außerhalb der kopieren Parameter übergeben, um den neuen thread. LuaLanes stellt einige Kreuz-Verbindungs-code.
InformationsquelleAutor Nicol Bolas
Es ist nicht möglich, mit dem core-Lua-Bibliotheken (wenn Sie nicht zählen die Erstellung mehrerer Prozesse und die Kommunikation über die input/output), aber ich denke, es gibt ein Lua-bindings für unterschiedliche threading-Bibliotheken gibt.
Den Antwort von jpjacobs zu einer der Fragen links zu LuaLanes, das scheint zu sein, eine multi-threading-Bibliothek. (Ich habe keine Erfahrung, aber.)
Wenn Sie das einbetten von Lua in eine Anwendung, in der Regel werden Sie wollen, um die multithreading irgendwie in Verbindung, um Ihre Anwendungen multithreading.
InformationsquelleAutor Paŭlo Ebermann
Neben LuaLanes, werfen Sie einen Blick auf llthreads
InformationsquelleAutor Doug Currie
Zusätzlich zu den bereits vorgeschlagenen LuaLanes, llthreads und andere Sachen erwähnt hier, es ist ein einfacher Weg.
Wenn Sie auf POSIX-system, versuchen Sie, es zu tun in der altmodische Art und Weise mit
posix.fork()
(aus luaposix). Wissen Sie, teilen Sie die Aufgabe zu losen, Gabel die gleiche Anzahl der Prozesse die Anzahl der Kerne, crunch die zahlen, Sortieren die Ergebnisse.Stellen Sie außerdem sicher, dass Sie über LuaJIT 2 man die max Geschwindigkeit.
InformationsquelleAutor Alexander Gladysh
Es ist sehr einfach, erstellen Sie einfach mehrere Lua-Interpreter und ausführen von lua-Programmen in allen von Ihnen.
Lua multithreading ist eine shared-nothing-Modell. Wenn Sie brauchen, um Daten auszutauschen, müssen Sie die Serialisierung der Daten in Zeichenfolgen, und übergeben Sie dann von einem interpreter, der andere entweder mit einer c-Erweiterung oder-Steckdosen oder jede Art von IPC.
InformationsquelleAutor Lothar
Serialisieren von Daten via IPC-wie transport-Mechanismen ist nicht die einzige Möglichkeit zum freigeben von Daten über threads.
Wenn Sie die Programmierung in einer objektorientierten Sprache wie C++, dann ist es durchaus möglich, dass mehrere threads auf gemeinsam genutzte Objekte über threads über Objekt-Pointer, es ist nur nicht sicher, dies zu tun, es sei denn, Sie geben eine Art von Garantie, dass keine zwei threads versuchen, gleichzeitig Lesen und schreiben zu den gleichen Daten.
Gibt es viele Optionen für Sie, wie Sie das tun, ist lock-free-und wait-free Mechanismen werden immer beliebter.
InformationsquelleAutor Homer