【问题标题】:Lua :: How to write simple program that will load multiple CPUs?Lua :: 如何编写将加载多个 CPU 的简单程序?
【发布时间】:2011-09-17 05:17:45
【问题描述】:

我无法在 Lua 中编写一个可以加载多个 CPU 的程序。自从Luasupports the concept via coroutines之后,相信是可以实现的。

我失败的原因可能是以下之一:

  • 在 Lua 中是不可能的
  • 我写不出来 ☺(希望是这样的

有经验的人(我两周前发现 Lua)能给我指出正确的方向吗?


The point is to write a number-crunching script that does hi-load on ALL cores... 用于 Lua 功能的演示。

谢谢...

【问题讨论】:

    标签: multithreading lua multicore coroutine


    【解决方案1】:

    核心 Lua 库是不可能的(如果您不计算创建多个进程并通过输入/输出进行通信),但我认为有针对不同线程库的 Lua 绑定。

    answer from jpjacobs to one of the related questions 链接到LuaLanes,这似乎是一个多线程库。 (不过我没有经验。)

    如果您将 Lua 嵌入到应用程序中,您通常希望将多线程以某种方式链接到您的应用程序多线程。

    【讨论】:

      【解决方案2】:

      除了LuaLanes,看看llthreads

      【讨论】:

        【解决方案3】:

        Lua 协程与操作系统意义上的线程不同。

        操作系统线程是抢占式的。这意味着它们将在任意时间运行,窃取操作系统规定的时间片。如果可用,它们将在不同的处理器上运行。并且它们可以尽可能同时运行。

        Lua 协程不这样做。协程可能具有“线程”类型,但一次只能有一个协程处于活动状态。协程将一直运行,直到协程本身通过发出coroutine.yield 命令决定停止运行。一旦它产生,它将不会再次运行,直到另一个例程向该特定协程发出 coroutine.resume 命令。

        Lua 协程提供 cooperative 多线程,这就是它们被称为 co 例程的原因。他们相互合作。一次只运行一件事,并且只有在任务明确要求时才切换任务。

        您可能认为您可以创建操作系统线程,在 Lua 中创建一些协程,然后在不同的操作系统线程中恢复每个协程。只要每个 OS 线程都在不同的 Lua instance 中执行代码,这就会起作用。 Lua API 是可重入的;您可以从不同的操作系统线程调用它,但如果从不同的 Lua 实例调用。如果您尝试通过同一个 Lua 实例进行多线程处理,Lua 可能会做一些不愉快的事情。

        现有的所有 Lua 线程模块都会为每个线程创建备用 Lua 实例。 Lua-lltreads 只是为每个线程创建一个全新的 Lua 实例;除了复制传递给新线程的参数之外,没有用于线程间通信的 API。 LuaLanes 确实提供了一些交叉连接代码。

        【讨论】:

          【解决方案4】:

          除了已经建议的 LuaLanes、llthreads 和其他 here 提到的东西,还有一个更简单的方法。

          如果您使用的是 POSIX 系统,请尝试以老式方式使用 posix.fork()(来自 luaposix)。您知道,将任务拆分为批次,派生与内核数量相同数量的进程,处理数字,整理结果。

          另外,请确保您使用 LuaJIT 2 以获得最大速度。

          【讨论】:

            【解决方案5】:

            创建多个 Lua 解释器并在其中运行 lua 程序非常简单。

            Lua 多线程是一种无共享模型。如果您需要交换数据,您必须将数据序列化为字符串,并使用 c 扩展或套接字或任何类型的 IPC 将它们从一个解释器传递到另一个解释器。

            【讨论】:

              【解决方案6】:

              通过类似 IPC 的传输机制序列化数据并不是跨线程共享数据的唯一方法。

              如果您使用像 C++ 这样的面向对象语言进行编程,那么多个线程很可能通过对象指针跨线程访问共享对象,这样做是不安全的,除非您提供某种保证两个线程将尝试同时读取和写入相同的数据。

              您可以通过多种方式执行此操作,无锁和无等待机制正变得越来越流行。

              【讨论】:

                猜你喜欢
                • 2014-11-07
                • 2013-03-31
                • 1970-01-01
                • 2017-09-02
                • 2011-07-21
                • 2014-02-28
                • 1970-01-01
                • 1970-01-01
                • 2020-03-10
                相关资源
                最近更新 更多