(一)协程的创建
--协同程序
--在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 版权协议,转载请附上原文出处链接和本声明。