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)) --创建出来的不是线程类型而是函数
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() --因为其本质就是函数,直接调就完事了
协程的挂起(关键)
--协程挂起 fun2 = function() --先弄一个死循环 while true do print(123) --下面这个就是协程的挂起函数 coroutine.yield()--让其处于一个挂起的状态 end end co3 = coroutine.create(fun2) coroutine.resume(co3)
上面的协程只执行了一次
这个跟我们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)
从上面就可以很直观的看到,每执行一次Coroutine.resume()启动协程,协程就在前一次的基础上,继续运算
我们在用coroutine.wrap()试下,原理也是一样的
结果也是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)
默认第一个返回值是协程是否启动成功,第二个是yield里面的返回值
我们再看看用coroutine.wrap()下的情况使用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)) -- 协程结束
- 这个函数可以获得当前正在 运行的协程的线程号
coroutine.running()
这个想要打印得放在协程里面,并且在yeild的前面
你还在原价购买阿里云、腾讯云、华为云、天翼云产品?那就亏大啦!现在申请成为四大品牌云厂商VIP用户,可以3折优惠价购买云服务器等云产品,并且可享四大云服务商产品终身VIP优惠价,还等什么?赶紧点击下面对应链接免费申请VIP客户吧:
相关文章
- Linux 命令(235)—— mktemp 命令
- Linux连接数
- Linux 将Shell脚本转换为C
- proto vs gzip proto in golang
- 基于go语言的声明式流式ETL,高性能和弹性流处理器
- C/C++ 实现远程线程DLL注入
- C/C++ 实现远程代码注入
- 嵌入式:ARM嵌入式系统开发流程概述
- 嵌入式:ARM常用开发编译软件介绍
- C++——构造函数的使用注意事项及static用法
- 嵌入式系统底层软件的复杂性
- git 命令别名配置
- C和C++安全编码复习
- git 无法提交空目录 ? (.gitkeep 文件的作用)
- PHP 字符串中 {} 的使用
- PowerShell 反弹渗透技巧
- Kali Linux安装AWVS漏扫工具
- brew 安装 nginx 配合PHP工作
- Linux 系统的安全加固
- C/C++ 编写并提取简易 ShellCode