从多线程(multithreading) 的角度看,协程(coroutine)与线程(thread)类似:协程是一系列的可执行语句,拥有自己的栈、局部变量和指令指针,同时协程又与其他协程共享了全局变量和其他几乎一切资源。线程与协程的主要区别在于,一个多线程程序可以并行运行多个线程,而协程却需要彼此协作地运行,即在任意时刻只能有一个协程运行,且只有当正在运行的协程显示地要求被挂起(suspend)时其执行才会暂停。
协程的真正强大之处在于函数 yeild,该函数可以让一个运行中的协程挂起自己,然后在后续恢复运行,例如:
co = coroutine.create(function ()
for i = 1, 10 do
print("co", i)
coroutine.yield()
end
end)
- 其中,协程进行了一个循环,在循环中输出数字并在每次打印后挂起。当唤醒协程后,他就会开始执行直到遇到第一个 yield:
coroutine.resume(co)
- 此时,如果我们查看协程状态,会发现协程处于挂起状态,因此可以再次恢复运行:
print(coroutine.status(co))
从协程的角度看,在挂起期间发生的活动都发生在协程调用 yield 期间。当我们唤醒协程时,函数 yield 才会最终返回,然后协程会继续执行直到写一个 yield 或执行结束:
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co) -- 不输出任何数据
- 在最后一次调用 resume 时,协程体执行完毕并返回,不输出任何数据。如果我们视图再次唤醒它,函数 resume 将返回 false 及一条错误信息:
print(coroutine.resume(co))
网友评论