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

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

Причиной для меня может быть одна из следующих причин:

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

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


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

Спасибо ...

Ответы [ 6 ]

12 голосов
/ 17 июня 2011

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

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

Lua сопрограммы не делают этого. Сопрограммы могут иметь тип «поток», но может быть только один активный сопрограмма одновременно. Сопрограмма будет работать до тех пор, пока сама сопрограмма не решит прекратить работу, введя команду coroutine.yield. И как только он выдаст, он не запустится снова, пока другая подпрограмма не выдаст команду coroutine.resume для этой конкретной сопрограммы.

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

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

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

6 голосов
/ 17 июня 2011

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

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

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

2 голосов
/ 17 июня 2011

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

1 голос
/ 19 июня 2011

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

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

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

0 голосов
/ 12 июня 2014

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

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

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

0 голосов
/ 20 июня 2011

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

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

...