协程
其执行过程类似于不带返回值的函数调用。
一个程序可以包含多个协程,可以对比与一个进程包含多个线程:
- 线程相互独立,有自己的上下文,切换受系统控制;
- 协程也相对独立,也有自己的上下文,但是切换由自己控制。
【由当前协程切换到其他协程由当前协程控制】
【可以把协程看成是一个可自行决定调度切换的线程】
编成语言 Lua 从 5.0 版本开始支持协程的概念,极大的扩展了 Lua 的能力。
Lua 的协程通过扩展库 coroutine 来实现。
coroutine.close(co) ------------------------ 关闭协程,返回 bool
coroutine.create(f) ------------------------ 创建协程,传入一个 function,返回一个协程句柄
coroutine.isyieldable([co]) ---------------- 判断协程是否是 yield 状态
coroutine.resume(co, [, val1, ...]) -------- 将挂起状态的协程重新激活,val 参数,返回 true/false 运行状态
coroutine.running() ------------------------ 获取正在运行的协程
coroutine.status(co) ----------------------- 获取 co 句柄对应的协程的状态 [suspended(挂起), running(执行中), dead(结束)]
coroutine.wrap(f) -------------------------- 用 function 创建一个新的协程,返回一个函数,调用此函数,进入协程
coroutine.yield(...) ----------------------- 挂起当前协程
双循环切换
function func1()
while true do
print("func1--111")
-- sleep(1)
coroutine.yield()
end
end
function func2()
while true do
print("func2--222")
-- sleep(1)
coroutine.yield()
end
end
local handle1 = coroutine.create(func1)
local handle2 = coroutine.create(func2)
while(true) do
print("==========")
print(coroutine.status(handle1))
print(coroutine.status(handle2))
coroutine.resume(handle1)
coroutine.resume(handle2)
print(coroutine.status(handle1))
print(coroutine.status(handle2))
end
-- ==========
-- suspended
-- suspended
-- func1--111
-- func2--222
-- suspended
-- suspended
-- ==========
-- suspended
-- suspended
-- func1--111
-- func2--222
-- suspended
-- suspended
-- ...
-- ...
-- ...
迭代器
function iter()
return coroutine.wrap(function()
for i=1,3 do
coroutine.yield(i)
end
return nil
end)
end
-- local f = iter()
-- print(f())
-- print(f())
-- print(f())
-- print(f())
for i in iter() do
print(i)
end
-- 1
-- 2
-- 3
本文含有隐藏内容,请 开通VIP 后查看