Lua语法详解之协同程序(创建,运行,挂起,状态)

  • Post author:
  • Post category:其他


(一)协程的创建

--协同程序
--在lua中协程的本质是线程
--协程的创建
--(常用)第一种创建方式,coroutine.create(),返回值是一个线程

fun=function()
	print("hello")
end
co=coroutine.create(fun)
print(co)--thread: 0x7faa1450dc48
print(type(co))--thread

--第二种创建方式,coroutine.warp(),返回值是一个函数
co1=coroutine.wrap(fun)
print(co1)--function: 0x7fd10a6074d0
print(type(co1))--function

coroutine.create(function()
	print("world")
end)


(二)协程的运行

--协程的运行
--以create方式创建的协程的运行
coroutine.resume(co)--hello,co=coroutine.create(fun)
--以wrap方式方式创建的协程的运行,直接以函数方式运行
co1=coroutine.wrap(fun)
co1()--hello

(三)协程的挂起,协程的挂起可以有返回值

--协程的挂起
fun=function()
	while true do--这是一个死循环
		print("hello world")
		coroutine.yield()--协程的挂起函数,也就是执行1句hell oworld就挂起了
	end
end
co3=coroutine.create(fun)
coroutine.resume(co3)--hello world,只打印1次
--如果要执行多次这个协程,就多次运行
--在c#中,这种死循环的协程因为有循环会不停的执行,但是lua是从上到下执行的,要再运行,只能是再重启一次,重启的时候,从上次暂停的地方再执行一次
coroutine.resume(co3)--hello world
coroutine.resume(co3)--hello world
--以wrap方式挂起,直接调用函数
co4=coroutine.wrap(fun)
co4()--hello world
--要再次调用协程,就再次重启函数
co4()--hello world

--协程挂起有返回值
--第一种方式获取协程挂起的返回值
fun1=function ()
	local i=0
	while true do
		i=i+1
		print(i)
		coroutine.yield(i)--这个协程挂起可以带返回值,可以开启协程后用变量接收它
	end
end
co5=coroutine.create(fun1)--创建协程
isOk,tempI=coroutine.resume(co5)--开启协程,这里有两个返回值,一个是默认的boolean类型,协程有没有开启成功
					  --第二个参数就是这个协程挂起时返回的i
print(isOk,tempI)--true,1
isOk,tempI=coroutine.resume(co5)
print(isOk,tempI)
isOk,tempI=coroutine.resume(co5)
print(isOk,tempI)--true,3,每开启一次协程,i加1

--第二种方式协程挂起的返回值
co7=coroutine.wrap(fun1)
a=co7()--用个变量直接接协程挂起时返回的变量
print(a)--1
print(co7())--
print(co7())--3,协程开启了3次,每次i+1

(四)协程的状态

coroutine.status(协程对象)

corountine.running(协程对象)–当前正在运行的协程的编号

--协程的状态,dead(执行完了),suspended(暂停),running(正在运行,可以从协程内部得到其状态)
--只有用create方式创建的协程才能查其状态
--第一种方式:coroutine.status(协程对象)
print(coroutine.status(co5))--suspended
--print(coroutine.status(co7))--因为co7是以wrap方式开启的,这里的参数不是线程,而是个函数,所以会报错
--第二种方式,corountine.running(协程对象)--当前正在运行的协程的编号
fun=function()
	while true do--这是一个死循环
		print("hello world")
		print(coroutine.running(co3))--thread: 0x7fe6a8609268	false
		print(coroutine.status(co3))--running
		coroutine.yield()
	end
end
co3=coroutine.create(fun)
coroutine.resume(co3)--








版权声明:本文为qq_42385019原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。