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所创,推荐一下!我也在群里!

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

猜你喜欢

转载自blog.csdn.net/Mr_Sun88/article/details/105877427