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

问题描述 投票:11回答:6

我无法在Lua中编写一个可以加载多个CPU的程序。自Lua supports 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
6个回答
12
投票

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

操作系统线程是先发制人的。这意味着它们将在任意时间运行,根据操作系统的要求窃取时间片。如果可用,它们将在不同的处理器上运行。它们可以在可能的同时运行。

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

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

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

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


6
投票

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

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

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


2
投票

除了LuaLanes,请看看llthreads


1
投票

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

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

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


0
投票

只需创建多个Lua解释器并在所有这些解析器中运行lua程序即可。

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


0
投票

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

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

对于如何做到这一点有很多选择,无锁和无等待机制正变得越来越流行。

© www.soinside.com 2019 - 2024. All rights reserved.