Lua: Как написать простую программу, которая будет загружать несколько процессоров?

Я не смог написать программу в Lua, которая будет загружать более одного процессора. С Луа поддерживает концепцию через coroutines, Я считаю, что это достижимо.

причиной моей неудачи может быть одна из:

  • это невозможно в Lua
  • Я не могу это написать ☺ (и Надежда в случае )

может кто-то более опытный (я обнаружил Lua две недели назад) указать мне в правильном направлении?


The point is to write a number-crunching script that does hi-load on ALL cores... Для демонстративных целей власти Lua.

спасибо...

6 ответов


Lua coroutines-это не то же самое, что потоки в смысле операционной системы.

потоки ОС с вытеснением. Это означает, что они будут работать в произвольное время, кража timeslices как продиктовано ОС. Они будут работать на разных процессорах, если они доступны. И они могут бежать в одно и то же время, где это возможно.

Lua coroutines не делают этого. У сорутинов может быть тип "поток", но одновременно может быть только одна активная корутина. Сопрограмма продлится до самого сопрограмма решает остановить выполнение путем выдачи . И как только он уступит, он не будет работать снова, пока другая процедура не выдаст a coroutine.resume команда для этой конкретной корутины.

Lua coroutines обеспечивают кооператива многопоточность, вот почему они называются coпроцедуры. Они сотрудничают друг с другом. Только одна вещь выполняется одновременно, и вы переключаете задачи только тогда, когда задачи явно говорят делать так.

вы можете подумать, что вы можете просто создать потоки ОС, создать некоторые сопрограммы в Lua, а затем просто возобновить каждый из них в другом потоке ОС. Это будет работать до тех пор, пока каждый поток ОС выполнял код в другом Lua instance. В API Lua является реентерабельной; вы не разрешили позвонить в него из разных потоков ОС, но только if вызывают из разных экземпляров Lua. Если вы попытаетесь многопоточно через тот же экземпляр Lua, Lua, вероятно, сделает неприятное вещи.

все существующие модули потоков Lua создают альтернативные экземпляры Lua для каждого потока. Lua-lltreads просто создает совершенно новый экземпляр Lua для каждого потока; нет API для связи поток-поток за пределами параметров копирования, передаваемых в новый поток. LuaLanes не кроссовая код.


Это невозможно с основными библиотеками Lua (если вы не считаете создание нескольких процессов и связь через вход/выход), но я думаю, что есть привязки Lua для разных библиотек потоков там.

на ответ от jpjacobs на один из связанных вопросов ссылки LuaLanes, который, похоже, является многопоточной библиотекой. (Впрочем, у меня нет опыта.)

Если вы вставляете Lua в приложение, вы обычно хотите, чтобы многопоточность была как-то связана с многопоточностью ваших приложений.


в дополнение к LuaLanes, взгляните на llthreads


в дополнение к уже предложенным LuaLanes, llthreads и другим упомянутым вещам здесь, есть более простой способ.

Если вы находитесь в системе POSIX, попробуйте сделать это старомодным способом с posix.fork() (от luaposix). Знаете, разбить задачу на пакеты, разделить то же количество процессов, что и количество ядер, свернуть числа, сопоставить результаты.

кроме того, убедитесь, что вы используете LuaJIT 2 получить максимальное скорость.


очень легко просто создать несколько интерпретаторов Lua и запустить программы lua внутри всех из них.

Lua многопоточность является общей моделью ничего. Если вам нужно обмениваться данными, вы должны сериализовать данные в строки и передать их от одного интерпретатора к другому с расширением c или сокетами или любым типом IPC.


сериализация данных через IPC-подобные транспортные механизмы-не единственный способ обмена данными между потоками.

Если вы программируете на объектно-ориентированном языке, таком как C++, то для нескольких потоков вполне возможно получить доступ к общим объектам через потоки через указатели объектов, это просто небезопасно, если вы не предоставите какую-то гарантию того, что никакие два потока не будут пытаться одновременно читать и записывать одни и те же данные.

есть много вариантов для как вы можете это сделать, механизмы без блокировки и ожидания становятся все более популярными.