Lua - 协程生命周期
协程生命周期是从协程创建、运行到结束的一系列状态。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− 表示协程已完成执行,无法被恢复。