Lua如何编写简单的程序以加载多个CPU?

我无法编写一个 Lua 程序,它可以加载多个 CPU。由于 Lua 支持协程的概念,我相信这是可以实现的。

导致我失败的原因可能是:

  • Lua 不支持
  • 我无法编写(并且我希望这是原因)

有更多经验的人(我两周前才发现 Lua)可以指点一下我吗?


关键是编写一个数字计算脚本,在所有核心上进行高负载... 为了展示 Lua 的强大。

谢谢...

原文链接 https://stackoverflow.com/questions/6386717

点赞
stackoverflow用户600500
stackoverflow用户600500

在核心 Lua 库(如果不考虑通过输入/输出创建多个进程的情况)中不可能实现,但我认为有 Lua 绑定不同线程库的存在。

来自 jpjacobs 对相关问题的回答 链接到 LuaLanes,这似乎是一个多线程库。(我没有经验)

如果您将 Lua 嵌入到应用程序中,则通常希望将多线程与应用程序的多线程相链接。

2011-06-17 14:04:14
stackoverflow用户33252
stackoverflow用户33252

除了 LuaLanes,还可以看看 llthreads

2011-06-17 14:13:43
stackoverflow用户734069
stackoverflow用户734069

Lua 协同程序和操作系统中的线程不是同一概念。

操作系统中的线程是抢占式的。也就是说,它们会在任意时间运行,根据操作系统的时间片来分配运行时间。如果有多个处理器,则它们可以在不同的处理器上运行。它们还可以在可能的情况下同时运行。

Lua 协同程序不会这样做。虽然协同程序的类型可能是 “线程”,但同一时间只能有一个协同程序处于活动状态。协同程序将运行,直到协同程序本身决定通过发出 coroutine.yield 命令停止运行。一旦它被挂起,它就不会再运行,直到另一个例程对该特定协同程序发出 coroutine.resume 命令。

Lua 协同程序提供了 协作式的 多线程,这也是它们被称为 co 协同程序的原因。它们彼此合作。一次只运行一件事情,只有在任务明确要求切换任务时才会进行任务切换。

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

所有存在的 Lua 线程模块都为每个线程创建了替代的 Lua 实例。Lua-lltreads 为每个线程创建了全新的 Lua 实例;在新线程中没有线程间通信的 API。LuaLanes 确实提供了一些交叉连接代码。

2011-06-17 16:51:18
stackoverflow用户6236
stackoverflow用户6236

除了已经提出的 LuaLanes、llthreads 和其他在 这里提到的东西之外,还有一个更简单的方法。

如果你在 POSIX 系统上,请尝试用“老派”方式 posix.fork()(来自 luaposix)来完成它。你知道,将任务分批处理,分叉出与核数相同的进程,计算结果并收集结果。

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

2011-06-19 02:33:30
stackoverflow用户155082
stackoverflow用户155082

很简单,只需创建多个 Lua 解释器并在所有解释器中运行 lua 程序。

Lua 多线程采用共享无模式。如果需要交换数据,则必须将数据序列化为字符串,并使用 c 扩展、socket 或任何类型的 IPC 将其从一个解释器传递到另一个解释器。

2011-06-20 08:39:19
stackoverflow用户3732952
stackoverflow用户3732952

通过类似IPC的传输机制对数据进行序列化并不是在线程之间共享数据的唯一方式。

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

有许多选项可供您执行此操作,无锁和无等待机制越来越受欢迎。

2014-06-12 07:07:46