qq空间是用什么做的网站,湛江做网站的公司,建设网站小常识,网站建设哪家好采用苏州久远网络也许更好的阅读体验 协程简单理解为可以暂停的线程#xff0c;但是同一时刻只有一个协程可以处于运行状态。 文章目录 coroutine.create()coroutine.resume()coroutine.wrap()coroutine.yield()coroutine.resume()参数传递resume和yield之间互换数据 coroutine.create()
lua…也许更好的阅读体验 协程简单理解为可以暂停的线程但是同一时刻只有一个协程可以处于运行状态。 文章目录 coroutine.create()coroutine.resume()coroutine.wrap()coroutine.yield()coroutine.resume()参数传递resume和yield之间互换数据 coroutine.create()
lua中使用coroutine.create()创建一个协程参数是一个函数返回值为创建的协程这个协程运行内容就是这个函数了。 协程有三种状态挂起、运行、停止。 协程刚创建时处于挂起状态。 可以在代码中使用coroutine.status()查看协程状态。
function foo ()print(im running )
end
co coroutine.create(foo)
print(coroutine.status(co))运行结果
suspendedcoroutine.resume()
可以在代码中使用coroutine.resume()来唤醒一个被挂起的协程。 运行完毕的协程状态为停止。
function foo ()print(im running )
end
co coroutine.create(foo)
coroutine.resume(co)
print(coroutine.status(co))运行结果
im running
deadcoroutine.wrap()
每次都调用coroutine.resume()有点麻烦。可以使用coroutine.wrap()像直接调用函数一样唤醒协程。
function foo ()print(im running )
end
co coroutine.wrap(foo)
co()运行结果
im running coroutine.yield()
可以在函数中使用coroutine.yield()来挂起协程。 下一次resume会从挂起位置继续执行。
function foo ()print(im running )coroutine.yield()print(i running again)
end
co coroutine.create(foo)
coroutine.resume(co)
print(coroutine.status(co))
coroutine.resume(co)运行结果
im running
suspended
i running againcoroutine.resume()参数传递
如果函数有参数第一次调用coroutine.resume()时可以传参。
function say (s)print(i say .. s)
end
co coroutine.wrap(say)
co(hello)运行结果
i say helloresume和yield之间互换数据
在第一次调用coroutine.resume()后coroutine.resume()可以和coroutine.yield()互相交换数据。 coroutine.resume()的参数会作为coroutine.yield()函数的结果。 coroutine.yield()的参数会作为coroutine.resume()函数的结果。
function say (s)print(i say .. s)print(coroutine.yield(let me have a rest))
end
co coroutine.wrap(say)
t co(hello)
print(t)
co(no)运行结果
i say hello
let me have a rest
no这里say()方法我特意这样写就是为了让读者直观感受coroutine.yield()直接挂起协程是什么样的。 解释一下hello作为第一次调用co的参数是对应的参数s运行到coroutine.yield()时挂起协程并将括号里的let me have a rest传递给tno作为第二次调用co的参数时是作为coroutine.yield()的返回值。