什么Lua的多线程包"只是工作"出货?

Nor*_*sey 35 parallel-processing lua multithreading

在Lua中编码,我有一个三次嵌套循环,经历了6000次迭代.所有6000次迭代都是独立的,可以很容易地并行化.Lua的哪些线程包开箱即用,并在四个或更多内核上获得了不错的并行加速

这是我目前所知道的:

  • luaproc来自核心Lua团队,但luaforge上的软件包很旧,邮件列表中有关于segfaulting的报告.此外,对我来说,如何使用标量消息传递模型将结果最终导入父线程并不明显.

  • Lua Lanes提出了有趣的说法,但似乎是一个重量级,复杂的解决方案.邮件列表上的许多消息都表示无法让Lua Lanes为他们构建或工作.我自己很难让潜在的"Lua rock"分发机制为我工作.

  • LuaThread需要显式锁定,并要求线程之间的通信由受锁保护的全局变量调解.我可以想象更糟糕,但我对更高层次的抽象感到更高兴.

  • Concurrent Lua提供了一个类似于Erlang的有吸引力的消息传递模型,但它表示进程不共享内存.目前尚不清楚是否spawn实际使用任何 Lua函数或是否存在限制.

  • Russ Cox提出了一种偶尔的线程模型,它只适用于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 Code Online (Sandbox Code Playgroud)

run_test函数作为参数传入,因此只有当包可以并行运行任意函数时,它才对我有用.我的目标是足够的并行性,以在6到8个内核上获得100%的CPU利用率.

Ale*_*ysh 1

我意识到这不是一个开箱即用的解决方案,但是,也许可以老派一下,用叉子玩?(假设您使用的是 POSIX 系统。)

我会做什么:

  • 在循环之前,将所有测试放入队列中,以便在进程之间访问。(文件、Redis LIST 或您最喜欢的任何其他内容。)

  • 同样在循环之前,生成几个分支lua-posix(与核心数量相同,甚至更多,具体取决于测试的性质)。在父分叉中等待,直到所有孩子都退出。

  • 在循环中的每个分支中,从队列中获取测试,执行它,将结果放在某处。(到文件、Redis 列表、任何您喜欢的地方。)如果队列中没有更多测试,请退出。

  • 在父级中,像现在一样获取并处理所有测试结果。

这假设测试参数和结果是可序列化的。但即使不是,我认为绕过这一点也应该很容易。