Lua Coroutine 生命周期是怎么样的?

文章导读
Previous Quiz Next 协程生命周期是从协程创建、运行到结束的一系列状态。Lua 提供了几种方法来控制协程的生命周期。以下是参与协程生命周期的方法。
📋 目录
  1. 示例 - 创建协程
  2. 示例 - 启动并挂起协程
  3. 示例 - 启动并挂起协程
  4. 示例 - 恢复协程
  5. 示例 - 协程完成
  6. 总结
A A

Lua - 协程生命周期



Previous
Quiz
Next

协程生命周期是从协程创建、运行到结束的一系列状态。Lua 提供了几种方法来控制协程的生命周期。以下是参与协程生命周期的方法。

  • coroutine.create() − 创建一个协程。

  • coroutine.resume() − 启动一个协程。

  • coroutine.yield() − 暂停协程执行。

  • return − return 语句结束协程执行。

让我们通过示例来探索每个状态。

示例 - 创建协程

我们可以使用 coroutine.create() 函数创建一个协程。此时,协程处于挂起状态,并且尚未启动。

main.lua

-- 创建一个函数来跟踪协程
function main()
   local function helper()
      -- 创建一个协程
      co = coroutine.create(function ()
         print("Coroutine started") -- 协程已启动
         coroutine.yield()
         print("Coroutine resumed") -- 协程已恢复
      end)
      return co
   end
      print("Main: Resuming coroutine") -- 主函数:恢复协程
   local status, value = coroutine.resume(helper())
   print("Main: Coroutine yielded with status:", status, "and value:", value) -- 状态将是 true,value 将是 nil(yield 没有参数)
end

main()

运行程序时不会执行任何操作,因为协程刚刚创建,目前处于挂起状态。

示例 - 启动并挂起协程

我们可以使用 coroutine.resume() 函数来启动协程。在 coroutine.yield() 的情况下,当前协程执行停止,控制权返回给调用函数。当我们向 coroutine.yield() 传递参数时,它会被 coroutine.resume() 调用返回。

main.lua

-- 创建一个函数来跟踪协程
function main()
   local function helper()
      -- 创建一个协程
      co = coroutine.create(function ()
         print("Coroutine started") -- 协程已启动
         coroutine.yield(1) -- 通过 1 挂起协程
         print("Coroutine resumed") -- 协程已恢复
      end)
      return co
   end
   print("Main: Coroutine resumed.") -- 主函数:协程已恢复。
   local status, value = coroutine.resume(helper())
   print("Main: Coroutine yielded with status:", status, "and value:", value)
end
main()

输出

运行上述程序时,将得到以下输出−

Main: Coroutine resumed.
Coroutine started
Main: Coroutine yielded with status:	true	and value:	1

示例 - 启动并挂起协程

我们可以使用 coroutine.resume() 函数来启动协程。在 coroutine.yield() 的情况下,当前协程执行停止,控制权返回给调用函数。当我们向 coroutine.yield() 传递参数时,它会被 coroutine.resume() 调用返回。

main.lua

-- 创建一个函数来跟踪协程
function main()
   local function helper()
      -- 创建一个协程
      co = coroutine.create(function ()
         print("Coroutine started") -- 协程已启动
         coroutine.yield() -- 挂起协程
         print("Coroutine resumed") -- 协程已恢复
      end)
      return co
   end
   print("Main: Coroutine resumed.") -- 主函数:协程已恢复。
   local status, value = coroutine.resume(helper())
   print("Main: Coroutine yielded with status:", status, "and value:", value)
end
main()

输出

运行上述程序时,将得到以下输出−

Main: Coroutine resumed.
Coroutine started
Main: Coroutine yielded with status:	true	and value:	nil

示例 - 恢复协程

我们可以使用 coroutine.resume() 函数从协程 yield 的位置恢复协程。

main.lua

-- 创建一个函数来跟踪协程
function main()
   local function helper()
      -- 创建一个协程
      co = coroutine.create(function ()
         print("Coroutine started")
         coroutine.yield(1) -- 通过 1 yield 协程
         print("Coroutine resumed")
      end)
      return co
   end
   print("Main: Coroutine resumed.")
   local status, value = coroutine.resume(helper())
   print("Main: Coroutine yielded with status:", status, "and value:", value)
end
main()

输出

当我们运行上述程序时,将得到以下输出−

Main: Coroutine resumed.
Coroutine started
Main: Coroutine yielded with status:	true	and value:	1

示例 - 协程完成

当我们从协程返回一个值时,它会终止并标记协程的完成。一旦完成,协程无法被恢复。

main.lua

co = coroutine.create(function ()
   print("Coroutine started.")
   return "Coroutine finished."
end)

local status, value = coroutine.resume(co)
print("Main: Coroutine finished with status:", status, "and value:", value)

local status, err = coroutine.resume(co)
print("Main: Attempting to resume finished coroutine with status:", status, "and value:", err)

输出

当我们运行上述程序时,将得到以下输出−

Coroutine started.
Main: Coroutine finished with status:	true	and value:	Coroutine finished.
Main: Attempting to resume finished coroutine with status:	false	and value:	cannot resume dead coroutine

总结

以下状态代表协程的生命周期。

  • Running− 表示协程当前正在执行。

  • Suspended− 表示协程尚未启动或使用 yield() 方法挂起。

  • Completed− 表示协程已完成执行,无法被恢复。