Какой многопоточный пакет для Lua «просто работает» в исходном состоянии?

Кодируя в 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 ядер.

35
задан Norman Ramsey 16 April 2011 в 20:53
поделиться