zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Lua协同程序(协程)

2023-02-26 10:20:51 时间

协程的创建

--协同程序(协程) --协程的创建 --常用方法 --通过coroutine.create() fun = function()     print(666)     end  --创建协程会有一个返回值,声明一个变量去接收 co = coroutine.create(fun) print(co) print(type(co))--类型线程  --第二种方法 --coroutine.wrap() co2= coroutine.wrap(fun) print(co2) print(type(co2)) --创建出来的不是线程类型而是函数

Lua协同程序(协程)

thread 指代协程(thread 是线程的意思,协程的本质还是线程对象。协程在lua内也是一个变量类型)
00DAC208 指协程的地址

(福利推荐:阿里云、腾讯云、华为云服务器最新限时优惠活动,云服务器1核2G仅88元/年、2核4G仅698元/3年,点击这里立即抢购>>>

协程的运行

--协程运行 fun = function()     print(666)     end  co = coroutine.create(fun) co2= coroutine.wrap(fun) --这是协程运行的第一种方式,对应运行通过coroutine.create()创建出来的协程 coroutine.resume(co)  --第二种方式 对应通过coroutine.wrap()创建出来的协程 co2() --因为其本质就是函数,直接调就完事了

Lua协同程序(协程)

协程的挂起(关键)

--协程挂起 fun2 = function()     --先弄一个死循环     while true do         print(123)         --下面这个就是协程的挂起函数         coroutine.yield()--让其处于一个挂起的状态     end end  co3 = coroutine.create(fun2) coroutine.resume(co3)

Lua协同程序(协程)
上面的协程只执行了一次
这个跟我们C#中的是不是不大一样
在C#中我们一旦启动了协程,它就会隔一帧或者几帧执行一次
但lua中很不一样,lua的代码是从上到下只执行一次的,没有循环的概念
因此每启动一次协程,只会启动一次协程函数,然后进去碰到yield就处于挂起状态
如果想要多次执行。就需要多次启动
每重新启动一次协程,就相当于在协程里的函数又跑了一次,可以理解为暂停/播放
为了更加直观一点,我们可以给上面的函数改造一下

fun2 = function()     --先弄一个死循环     local x = 0     while true do         x=x+1         print(x)         --下面这个就是协程的挂起函数         coroutine.yield()--让其处于一个挂起的状态     end end  co3 = coroutine.create(fun2) coroutine.resume(co3) coroutine.resume(co3) coroutine.resume(co3)

Lua协同程序(协程)
从上面就可以很直观的看到,每执行一次Coroutine.resume()启动协程,协程就在前一次的基础上,继续运算
我们在用coroutine.wrap()试下,原理也是一样的
Lua协同程序(协程)
结果也是123

yield是可以有返回值的
我们接着来进行操作

fun4 = function()     local x = 1     while true do         print(x)         x=x+1     -- 协程挂起函数     coroutine.yield(x) --在yield上加x     end end  co4 = coroutine.create(fun4) isTrue,tempI=coroutine.resume(co4) -- 搞一个参数接住它 print(isTrue,tempI)

Lua协同程序(协程)

默认第一个返回值是协程是否启动成功,第二个是yield里面的返回值

我们再看看用coroutine.wrap()下的情况
Lua协同程序(协程)使用coroutine.wrap()进行协程调用也可以有返回值 只是没有默认的第一个返回的布尔值

协程的状态

coroutine.status 协程对象

  • dead 结束
  • suspended 暂停 (只要挂起(yeild)就认为这个协程暂停))
  • running 进行中
funStop = function()     print('end')     end  fun5 = function()     local x = 1     while true do         print(x)          x=x+1     print(coroutine.status(co5)) --协程运行中     coroutine.yield(x)          end end  co5 = coroutine.create(fun5) coroutine.resume(co5) print(coroutine.status(co5)) -- 协程暂停(有yield)  co6 = coroutine.create(funStop) coroutine.resume(co6) print(coroutine.status(co6)) -- 协程结束

Lua协同程序(协程)

  • 这个函数可以获得当前正在 运行的协程的线程号
    coroutine.running()

这个想要打印得放在协程里面,并且在yeild的前面
Lua协同程序(协程)Lua协同程序(协程)
Lua协同程序(协程)

Lua协同程序(协程)


本站部分内容转载自网络,版权属于原作者所有,如有异议请联系QQ153890879修改或删除,谢谢!
转载请注明原文链接:Lua协同程序(协程)

你还在原价购买阿里云、腾讯云、华为云、天翼云产品?那就亏大啦!现在申请成为四大品牌云厂商VIP用户,可以3折优惠价购买云服务器等云产品,并且可享四大云服务商产品终身VIP优惠价,还等什么?赶紧点击下面对应链接免费申请VIP客户吧:

1、点击这里立即申请成为腾讯云VIP客户

2、点击这里立即注册成为天翼云VIP客户

3、点击这里立即申请成为华为云VIP客户

4、点击这里立享阿里云产品终身VIP优惠价

喜欢 (0)
[[email protected]]
分享 (0)