Lua学习记录(5) --- Lua中的协同程序 也称线程Coroutine的介绍

目录

一、Lua中的协程是什么样子的?

二、Lua中的协程的创建

(1)通过create的方式:

(2)通过wrap的方式

三、协程函数的使用

(1)通过coroutine.create创建的协程的使用方式

[(2)通过coroutine.wrap创建的协程的使用方式 前面说了 这个创建的类型直接就是 function 所以可以:](#(2)通过coroutine.wrap创建的协程的使用方式 前面说了 这个创建的类型直接就是 function 所以可以:)

四、协程函数的状态

[五、协程函数的可持续执行 我的意思是恢复执行 就是可以接着上回没执行完的代码继续执行](#五、协程函数的可持续执行 我的意思是恢复执行 就是可以接着上回没执行完的代码继续执行)


一、Lua中的协程是什么样子的?

我们如果学过C#就知道协程其实就是协同程序,将程序分成一段一段代码一点一点执行而不是立即将代码完全全部执行完毕。Lua中的协程类似 但是又很不同,在C#中我们可以通过 yield return 语法糖 在一个函数里面就可以执行一整段这个协程函数 当满足继续的条件时候 会自动往后执行未执行的代码

但是!lua的协程并不是自动执行的,需要我们做三件事:

1、写协程函数

2、利用协程函数创建协程

3、如果想多次执行协程 必须 反复激活协程

接下来我会从如何创建协程 到如何使用协程 进行有限讲解

二、Lua中的协程的创建

首先需要准备一个函数 来作为协程函数 然后才能创建协程

Lua 复制代码
fun = function ()
    print("协程开始执行")
end

有两种方式

(1)通过create的方式:

Lua 复制代码
-- 创建协程的方式一 常用方式 这样创建的变量类型是 thread
co = coroutine.create(fun) -- 这里的fun也可以直接就在这里进行声明 function () end
print(co)                  -- 协程的本质是一个线程对象
print(type(co))            -- 协程对象的类型是thread

(2)通过wrap的方式

Lua 复制代码
-- 创建协程的方式二 这样创建的协程函数就是 function变量类型了
co2 = coroutine.wrap(fun)
print(co2)
print(type(co2)) -- 协程对象的类型是function

三、协程函数的使用

由于创建方式的不同 所以他们的使用方法也不一致

(1)通过coroutine.create创建的协程的使用方式

Lua 复制代码
-- 协程的运行
-- 第一种方式 (使用create创建的协程就这样执行)
coroutine.resume(co) -- resume 恢复运行 协程从挂起状态变为运行状态

(2)通过coroutine.wrap创建的协程的使用方式 前面说了 这个创建的类型直接就是 function 所以可以:

Lua 复制代码
-- 第二种方式 (使用wrap创建的协程就这样执行)
co2()

四、协程函数的状态

状态有四种 通过这个获取 coroutine.status(协程对象) 获取协程的状态

-- 协程的状态有四种

-- suspended 暂停

-- running 运行状态

-- dead 结束

-- normal 正常状态

还有一个API是获取当前正在运行的协程 他会返回两个变量 一个是协程 一个是bool值 但是第二个bool值我一直都是nil的不知道为啥

Lua 复制代码
-- coroutine.running() 获取当前正在运行的协程对象
currentCo = coroutine.running()
print(currentCo) -- 一定是在函数内部运行的时候才能获取到协程对象得线程编号
-- 这个的返回值是线程编号

五、协程函数的可持续执行 我的意思是恢复执行 就是可以接着上回没执行完的代码继续执行

注意看下面的图片 只有多次执行了某一协程才能推动协程的往下进展 这里就和C#有很大的不同之处了 务必还是需要注意创建方式的不同 调用的方式也不同 我将下面的代码copy出来:

Lua 复制代码
fun2 = function ()
    local a = 1
    while true do
        print(a)
        a = a+1
        -- 协程的挂起 下面的这个yield 里面可以放返回值 就记住传参就是可以返回值
        coroutine.yield(a) -- yield 挂起 协程从运行状态变为挂起状态
        -- 这个默认还是多返回值 第一个返回值是协程是否正常运行的bool值 第二个是yield传递的值
    end
end

co3 = coroutine.create(fun2)
-- lua中只有重启一次才能继续执行
isOk,TempI = coroutine.resume(co3) -- 恢复运行
print(isOk,TempI)
isOk,TempI = coroutine.resume(co3) -- 再次恢复运行
print(isOk,TempI)

-- 这种方式的返回值就直接返回出来了 不需要像上面那样多返回值处理 没有状态位了
co4 = coroutine.wrap(fun2)
print("返回值"..co4()) -- 恢复运行
print("返回值"..co4()) -- 再次恢复运行

好的 今天也是深夜节目 再见!

相关推荐
txinyu的博客9 分钟前
解析业务层的key冲突问题
开发语言·c++·分布式
码不停蹄Zzz14 分钟前
C语言第1章
c语言·开发语言
行者961 小时前
Flutter跨平台开发在OpenHarmony上的评分组件实现与优化
开发语言·flutter·harmonyos·鸿蒙
阿蒙Amon1 小时前
C#每日面试题-Array和ArrayList的区别
java·开发语言·c#
SmartRadio1 小时前
ESP32添加修改蓝牙名称和获取蓝牙连接状态的AT命令-完整UART BLE服务功能后的完整`main.c`代码
c语言·开发语言·c++·esp32·ble
且去填词1 小时前
Go 语言的“反叛”——为什么少即是多?
开发语言·后端·面试·go
知乎的哥廷根数学学派2 小时前
基于生成对抗U-Net混合架构的隧道衬砌缺陷地质雷达数据智能反演与成像方法(以模拟信号为例,Pytorch)
开发语言·人工智能·pytorch·python·深度学习·机器学习
yeziyfx2 小时前
kotlin中 ?:的用法
android·开发语言·kotlin
charlie1145141913 小时前
嵌入式的现代C++教程——constexpr与设计技巧
开发语言·c++·笔记·单片机·学习·算法·嵌入式
好奇龙猫3 小时前
【AI学习-comfyUI学习-三十二节-FLXU原生态反推+controlnet depth(UNion)工作流-各个部分学习】
人工智能·学习