Lua的协程是不一样的东西在操作系统感线程。
操作系统线程处于抢占状态。这意味着它们将在任意时间运行,窃取OS所规定的时间片。如果可用,它们将在不同的处理器上运行。如果可能的话,他们可以同时运行。
Lua协同程序不这样做。协程可能有“线程”类型,但是一次只能有一个协程运行。协程将运行,直到协程本身通过发出coroutine.yield
命令决定停止运行。一旦它产生了,它就不会再运行,直到另一个例程向该特定协程发出coroutine.resume
命令。
Lua协程提供合作多线程,这就是为什么他们被称为co例程。他们相互合作。一次只运行一件事,并且只有在任务明确说明时才切换任务。
您可能会认为您可以创建操作系统线程,在Lua中创建一些协程,然后在不同的操作系统线程中恢复每个协程。只要每个操作系统线程都在不同的Lua instance
中执行代码,就可以工作。 Lua API是可重入的;您可以从不同的操作系统线程调用它,但如果从不同的Lua实例调用只有。如果您尝试通过相同的Lua实例进行多线程,Lua可能会做不愉快的事情。
所有存在的Lua线程模块为每个线程创建备用的Lua实例。 Lua-lltreads只是为每个线程创建一个全新的Lua实例;除了传递给新线程的参数外,没有用于线程间通信的API。 LuaLanes确实提供了一些交叉连接代码。