【问题标题】: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
【解决方案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++ 这样的面向对象语言进行编程,那么多个线程很可能通过对象指针跨线程访问共享对象,这样做是不安全的,除非您提供某种保证两个线程将尝试同时读取和写入相同的数据。
您可以通过多种方式执行此操作,无锁和无等待机制正变得越来越流行。