Lua 协同程序(coroutine)


Lua 协同程序(coroutine)是一种轻量级的线程,同时也是一种特殊的函数。协同程序能够在执行过程中暂停自己,让出执行权,然后再恢复执行,从而实现非抢占式多任务处理。Lua 协同程序通过yield和resume函数实现控制流的转移。

yield函数是用于挂起当前协同程序,让出执行权。并将当前协同程序的执行状态保存到堆栈中。代码示例如下:

co = coroutine.create(function()
  print("function start")
  coroutine.yield()
  print("function end")
end)

coroutine.resume(co) -- 输出 function start
coroutine.resume(co) -- 输出 function end

resume函数的作用是恢复一个被挂起的协同程序。如果resume函数在协同程序之外调用,那么它只是启动了协同程序,而不是恢复挂起的协同程序。可以使用coroutine.status函数查询协同程序的状态,以判断协同程序是否已经结束。

co = coroutine.create(function()
  print("function start")
  coroutine.yield()
  print("function end")
end)

print(coroutine.status(co)) -- 输出 suspended

coroutine.resume(co)
print(coroutine.status(co)) -- 输出 suspended

coroutine.resume(co)
print(coroutine.status(co)) -- 输出 dead

除了使用函数外,还可以使用协同程序库提供的一些API来实现协同程序的创建、转移控制流等功能。以下是协同程序库提供的一些API:

  • coroutine.create(func): 创建一个新的协同程序。
  • coroutine.resume(co, …): 恢复一个挂起的协同程序。
  • coroutine.yield(…): 暂停当前协同程序。
  • coroutine.status(co): 返回协同程序的状态信息。
  • coroutine.running(): 返回当前正在运行的协同程序对象。

在使用协同程序时,需要注意的是不能使用全局变量来共享数据。因为协同程序是并发运行的,互相之间不能共享数据,需要通过一些线程安全的技术来进行数据交换。

总之,Lua 协同程序是一种非常方便的多任务处理方式,但需要注意线程安全等问题。需要根据具体的情况选取最适合的并发处理方式。