Lua学习笔记之协程(coroutine)

目录

1、博客介绍

2、内容

(1)什么是协程 (摘自菜鸟教程)

(2)与线程的区别 (摘自菜鸟教程)

(3)方法 (摘自菜鸟教程)

(4)具体用法

3、推送

4、结语


1、博客介绍

本篇作为Lua学习笔记之一,记录有关Lua协程的相关知识点,本篇内容将会很浅显,仅仅是对不了解协程知识的一个入门级学习,想要深入的同学可以跳过。


2、内容

(1)什么是协程 (摘自菜鸟教程)

拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。

(2)与线程的区别 (摘自菜鸟教程)

一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作的运行。在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只有在明确的被要求挂起的时候才会被挂起。协同程序有点类似同步的多线程,在等待同一个线程锁的几个线程有点类似协同。

(3)方法 (摘自菜鸟教程)

方法描述
coroutine.create()创建 coroutine,返回 coroutine, 参数是一个函数,当和 resume 配合使用的时候就唤醒函数调用
coroutine.resume()重启 coroutine,和 create 配合使用
coroutine.yield()挂起 coroutine,将 coroutine 设置为挂起状态,这个和 resume 配合使用能有很多有用的效果
coroutine.status()查看 coroutine 的状态
注:coroutine 的状态有三种:dead,suspended,running,具体什么时候有这样的状态请参考下面的程序
coroutine.wrap()创建 coroutine,返回一个函数,一旦你调用这个函数,就进入 coroutine,和 create 功能重复
coroutine.running()返回正在跑的 coroutine,一个 coroutine 就是一个线程,当使用running的时候,就是返回一个 corouting 的线程号

(4)具体用法

我们可以通过create来创建一个协程,create的参数是一个函数,create返回的是一个thread,我们可以通过resume来调用这个thread来执行我们通过create创建的协程,如下述代码所示:

--创建
local co = coroutine.create(function()
	print("我被调用了")
end)

--启动
coroutine.resume(co)   

-----------------------------------输出
我被调用了

当一个协程运行后,我们是没有办法从外部将其停止的,只有在协程内部通过yield可以将协程挂起,或者称之为暂停,如下代码所示:

--创建
local co = coroutine.create(function()
	for i=1,10 do
		print("输出:"..i)
		if i == 5 then
			coroutine.yield()
		end
	end
end)

--启动
coroutine.resume(co)   

-----------------------------------输出
输出:1
输出:2
输出:3
输出:4
输出:5

与此同时,当一个协程被挂起后,我们可以继续通过resume再次调用thread来继续执行协程后续的内容,代码如下述所示:

--创建
local co = coroutine.create(function()
	for i=1,10 do
		print("输出:"..i)
		if i == 5 then
			coroutine.yield()
		end
	end
end)

--启动
coroutine.resume(co)   

----------被挂起后继续执行

--恢复
coroutine.resume(co)   

-----------------------------------输出
输出:1
输出:2
输出:3
输出:4
输出:5
输出:6
输出:7
输出:8
输出:9
输出:10

上述基本就是协程所有的内容了,下面我们说一下wrap方法,wrap方法和create相似,同样是创建一个协程,和create不同的是wrap返回的不是一个thread而是一个函数本身,通过wrap创建的协程,我们不再通过resume来调用和恢复,而是直接通过调用返回的函数本身来实现挂起和恢复,代码如下所示:

--创建
local co = coroutine.wrap(function()
	for i=1,10 do
		print("输出:"..i)
		if i == 5 then
			coroutine.yield()
		end
	end
end)

--调用  ---------将在输出五次后被挂起
co()

print("----------------------:被挂起")

--恢复
co()

-- -----------------------------------输出
输出:1
输出:2
输出:3
输出:4
输出:5
----------------------:被挂起
输出:6
输出:7
输出:8
输出:9

3、推送

Github:https://github.com/KingSun5


4、结语

若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。

       QQ交流群:806091680(Chinar)

       该群为CSDN博主Chinar所创,推荐一下!我也在群里!

       本文属于原创文章,转载请著名作者出处并置顶!!!!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lua 中,程(coroutine)是一种特殊的线程,可以在执行过程中挂起和恢复。程可以用于实现作式多任务,允许程序在某个点上暂停,并在稍后的时间点继续执行。下面是一些常见的 Lua 程使用方法: 1. 创建程:使用 `coroutine.create` 函数来创建一个新的程。 ```lua local co = coroutine.create(function() -- 程的执行逻辑 end) ``` 2. 启动程:使用 `coroutine.resume` 函数来启动或恢复一个程的执行。 ```lua local success, result = coroutine.resume(co) ``` 3. 挂起程:使用 `coroutine.yield` 函数来手动挂起一个程的执行,并返回结果。 ```lua local function foo() print("Hello") coroutine.yield() print("World") end local co = coroutine.create(foo) coroutine.resume(co) -- 输出 "Hello" coroutine.resume(co) -- 输出 "World" ``` 4. 检查程状态:使用 `coroutine.status` 函数来检查程的状态。 ```lua local status = coroutine.status(co) ``` 常见的状态有: - "suspended":程处于挂起状态,即已经创建但尚未执行或已经执行但被挂起。 - "running":当前正在执行的程。 - "dead":程已经执行完毕或发生错误导致终止。 以上是一些基本的程使用方法,还可以使用 `coroutine.wrap` 函数将一个函数转换为程。在实际应用中,程可以用于实现状态机、异步操作、迭代器等功能。根据具体需求,可以灵活运用程的特性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值