Lua学习笔记:协程

什么是协程

Lua 协同程序(coroutine)与线程(这里的线程指的是操作系统的线程)比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。一个多线程程序可以同时运行几个线程(并发执行、抢占),而协程却需要彼此协作地运行,并非真正的多线程,即一个多协程程序在同一时间只能运行一个协程,并且正在执行的协程只会在其显式地要求挂起(suspend)时,它的执行才会暂停(无抢占、无并发)。协同程序有点类似同步的多线程,在等待同一个线程锁的几个线程有点类似协同程序。

协程的使用

lua创建协程方式一共有两种

创建方式coroutine.create()coroutine.wrap()
类型threadfunction
启用方式coroutine.resume()XX()

协程创建和启动

-- coroutine.create()
ff = function() 
	print("ff") 
end
co = coroutine.create(ff)
print(type(co)) -- > thread

-- coroutine.wrap()
co2 = coroutine.wrap(ff)
print(type(co2)) -- > function

-- 协程的运行
coroutine.resume(co) -- >对应create()
co2() -- >对应warp()

协程的挂起

我们可以发现本该无限循环的 fun() 通过协程的挂起实现了每次运行一次的状态

-- 协程的挂起  coroutine.yield
fun = function()
    local i = 0
    while true do
        print(i)
        i = i + 1
        coroutine.yield(i, "你好")
    end
end

co = coroutine.create(fun)
co2 = coroutine.wrap(fun)

print(coroutine.resume(co)) -- > true	1	你好
coroutine.resume(co)
coroutine.resume(co)

print("-----------------------------------------------分割线-----------------------------------------------")
    
print(co2()) -- > 1 你好
co2()
co2()

输出结果 :
在这里插入图片描述
我们可以看到 create() 和 warp() 除了创建方式的差别外 他们使用时的返回值也不一样,
create()创建的协程第一位返回值为协程是否成功(Bool)+yield 返回参数,而 wrap() 返回值直接是 yield 返回参数

协程的状态

协程的状态可以使用方法 coroutine.status() 进行获取,共有3种情况 :
suspended 暂停
dead 结束
running 运行中
coroutine.running() 可以获取当前正在运行的协程

coroutine.status(XX)
print(coroutine.running()) -- >当前运行的协程

END

参考链接:https://blog.csdn.net/cooclc/article/details/112640610

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

又来077

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值