Кодируя в Lua, у меня есть трехвложенный цикл, который проходит 6000 итераций. Все 6000 итераций независимы и могут быть легко распараллелены. Какой пакет потоков для Lua компилируется из коробки , а получает приличное параллельное ускорение на четырех или более ядрах?
Вот что я знаю на данный момент:
luaproc
исходит от основной команды Lua, но пакет программного обеспечения на luaforge устарел, и в списке рассылки есть сообщения об этом. Кроме того, мне не очевидно, как использовать скалярную модель передачи сообщений для получения результатов в конечном итоге в родительском потоке.
Lua Lanes делает интересные заявления, но кажется тяжелым и сложным решением. Многие сообщения в списке рассылки сообщают о проблемах с созданием Lua Lanes или работой на них. У меня самого были проблемы с тем, чтобы базовый механизм распределения "Lua rocks" работал на меня.
LuaThread требует явной блокировки и требует, чтобы обмен данными между потоками осуществлялся глобальными переменными, которые защищены блокировками. Я мог представить себе и хуже, но я был бы более счастлив с более высоким уровнем абстракции.
Concurrent Lua предоставляет привлекательную модель передачи сообщений, аналогичную Erlang, но в нем говорится, что процессы не разделяют память. Неясно, действительно ли spawn
работает с любой Lua-функцией или существуют ограничения.
Расс Кокс предложил модель случайных потоков , которая работает только для C. потоки. Бесполезно для меня.
Я буду голосовать за все ответы, в которых сообщается о фактическом опыте этих или любых других многопоточных пакетов, или о любом ответе, который содержит новую информацию.
Для справки, вот цикл, который я хотел бы распараллелить:
for tid, tests in pairs(tests) do
local results = { }
matrix[tid] = results
for i, test in pairs(tests) do
if test.valid then
results[i] = { }
local results = results[i]
for sid, bin in pairs(binaries) do
local outcome, witness = run_test(test, bin)
results[sid] = { outcome = outcome, witness = witness }
end
end
end
end
Функция run_test
передается в качестве аргумента, поэтому пакет может быть мне полезен, только если он может запускать произвольные функции параллельно. Моя цель - достаточный параллелизм, чтобы получить 100% загрузку ЦП от 6 до 8 ядер.