协程的工作模式与进程/线程不同 , 其既不并发也不并行 , 其通过在多个任务之间跳转执行 . 正如其名"协作程序" .
Lua中的coroutine包含了多个成员方法 , 其用于控制协程 .
创建协程 : 传入该协程的主体函数 f
, 返回该协程 (一个thread类型变量) .
使用该方法创建的协程 , 需要调用resume()
函数运行 .
创建协程 : 传入该协程的主体函数 f
. 返回一个函数 , 每次调用其都可以延续该协程 .
使用该方法创建的协程 , 需要调用thread变量
运行(以一个函数的形式调用它) .
运行协程 : 开始或继续运行协程 co
, 返回启动的结果
和yield给的值
. val代表主体函数的参数 .
参数 : 第一个是协程变量
, 后面的参数是主题函数的参数
/上一次yield的返回值
.
返回值 : 第一个返回值是启动的结果
, 后面的返回值是主体函数的返回值
/本次yield的参数
.
挂起协程 : 挂起正在调用的协程的执行 , 它的参数将作为本次resume()
函数的返回值 .
参数 : 下次resume()
的返回值 ; 返回值 : 本次resume()的参数
.
关闭协程 : 关闭协程 co
, 并关闭它所有等待 to-be-closed 的变量 , 并将协程状态设为 dead
.
查看状态 : 返回协程 co
的运行状态 , 其可能是以下4种之一 :
"running"
: 正在运行 ."suspended"
: 挂起或是还没有开始运行 ."normal"
: 是活动的,但并不在运行 ."dead"
: 运行完主体函数或因错误停止 .检查协程是否可以挂起 : 返回协程 co
当前是否可以被挂起 .
获得当前运行的协程 : 返回当前正在运行的协程 , 同时返回一个布尔值(其表示该协程是否是主协程) .
local co = coroutine.create( --------- 创建协程
function(i)
print(i)
end
)
coroutine.resume(co, 1) -------------- 运行协程 -----------> 1
print(coroutine.status(co)) ---------- 查看状态 -----------> dead
print("----------")
co = coroutine.wrap( ----------------- 创建协程
function(i)
print(i)
end
)
co(1) -------------------------------- 运行协程 -----------> 1
print("----------")
co = coroutine.create(
function()
for i = 1, 10, 1 do
print(i)
if i == 3 then
print(coroutine.status(co)) -- 查看状态 -----------> running
print(coroutine.running()) --- 查看正在运行的协程 --> thread:xxx false
end
coroutine.yield() -------------- 挂起协程
end
end
)
coroutine.resume(co) ----------------- 运行协程 -----------> 1
coroutine.resume(co) ----------------- 运行协程 -----------> 2
coroutine.resume(co) ----------------- 运行协程 -----------> 3
print(coroutine.status(co)) ---------- 查看状态 -----------> suspended
print(coroutine.running()) ----------- 查看正在运行的协程 --> thread:xxx true
协程的特性使得其在某些情况下更有优势 , 例如生产者消费者模型 .
相比于线程的实现 , 协程的实现天生不需要加锁 , 也天生负载均衡 .
local newProductor
MaxNum = 10
Productor = function()
local num = 0
while num < MaxNum do
num = num + 1
print("send : " .. num)
Send(num)
end
end
Consumer = function()
local num = 0
while num < MaxNum do
print("recv : " .. num)
num = Recv()
end
end
Send = function(x)
coroutine.yield(x)
end
Recv = function()
local status, value = coroutine.resume(newProductor)
return value, status
end
newProductor = coroutine.create(Productor)
Consumer()
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。