检查协程状态
本课属于 Coddy Lua 学习旅程的“逻辑与流程”单元。第 52 课,共 54 课。
使用协程时,你经常需要了解协程处于什么状态。它现在正在运行吗?它是暂停了,正在等待恢复吗?它已经执行完了吗?
Lua 提供了 coroutine.status() 函数来回答这些问题。
coroutine.status() 函数接收一个协程作为参数,并返回一个描述其当前状态的字符串。可能有三种状态:
| "suspended" | 协程在 yield() 处暂停,可以恢复运行 |
| "running" | 协程当前正在执行 |
| "dead" | 协程已执行完毕,无法再次恢复运行 |
下面是用法:
function task()
coroutine.yield()
print("Finishing")
end
local co = coroutine.create(task)
print(coroutine.status(co)) -- "suspended"
coroutine.resume(co)
print(coroutine.status(co)) -- "suspended"(在 yield 处暂停)
coroutine.resume(co)
print(coroutine.status(co)) -- "dead"(已结束)挑战
简单编写一个函数 checkCoroutineLifecycle,它接收 resumeCount,并返回一个字符串,显示协程在生命周期不同阶段的状态。
创建一个只让出一次,然后完成的协程。在创建后、第一次恢复后(此时它在 yield 处暂停)以及根据 resumeCount 进行后续恢复后,检查并记录它的状态。
逻辑:
- 创建一个函数,让出字符串
"paused"一次,然后完成 - 使用
coroutine.create()将此函数包装成协程 - 使用
coroutine.status()检查创建后立即的状态 - 恢复协程一次,然后再次检查它的状态
- 根据
resumeCount - 1额外恢复协程若干次(总恢复次数 = resumeCount) - 所有恢复完成后检查最终状态
- 返回一个包含全部三个状态的字符串,格式为:
initial: [status]\\nafter first resume: [status]\\nfinal: [status]
参数:
resumeCount(数字):恢复协程的总次数(至少为 1)
返回值:一个字符串,显示协程在生命周期三个阶段的状态(字符串)。格式:initial: suspended\nafter first resume: suspended\nfinal: dead
亲手试试
function checkCoroutineLifecycle(resumeCount)
-- 在这里编写代码
end
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Lua 在线编译器