Lua五:协程
Lua的协程很像系统中的线程,也是一个独立的执行线。不同之处是,线程是并行执行的,而协程是协作式的,即同一时刻只有一个协程在执行,并且只有它自己显式请求挂起时,执行权才会转换。协程是一系列的可执行语句,拥有自己的栈、局部变量和指令指针,同时协程又与其他协程共享了全局变量和其他几乎一切资源。Lua语言提供的是所谓的非对称协程(asymmetric coroutine), 也就是说需要两个函数来控制协程的执行,一个用于挂起协程的执行,另一个用于恢复协程的执行。而其他一些语言提供的是对称协程( symmetric .coroutine),只提供一个函数用于在一个协程和另一个协程之间切换控制权。
一个协程有以下四种状态,即挂起(suspended)、 运行(running)、 正常(normal) 和死亡(dead)。
Lua语言中协程相关的所有函数都被放在表coroutine中。
1、函数create用于创建新协程,该函数只有一一个参数,即协程要执行的代码的函数(协程体(body))。 函数create返回一个「thread」类型的值,即新协程。通常,函数create的参数是一一个匿名函数,例如:
co = coroutine. create(function () print("hi") end)
print(type(co)) --> thread
2、我们可以通过函数corout ine. status来检查协程的状态:
print( coroutine. status(co)) - ->suspended
3、当一个协程被创建时,它处于挂起状态,即协程不会在被创建时自动运行。函数coroutine. resume用于启动或再次启动一个协程的执行,并将其状态由挂起改为运行:
coroutine. resume(co) --> hi
在上例中,协程体只是简单地打印了「hi」后便终止了,然后协程就变成了死亡状态:
print( coroutine. status(co)) --> dead
当匿名函数需要参数时,参数依次填入resume括号中,如:
co = coroutine. create(function (a, b,c)
print("co",a, b, c + 2)
end)
coroutine.resume(co,1, 2, 3) -->co 1 2 5
4、coroutine.yield (···)使正在执行的函数挂起。Lua语言中一个非常有用的机制是通过一对resume -yield来交换数据。在函数coroutine. resume的返回值中,第一个返回值为true 时表示没有错误,之后的返回值对应函数yield 的参数。与之对应的是,函数coroutine. yield的返回值是对应的resume 的参数。
co = coroutine. create(
function (a,b)
local c=a
a=b
b=c
print(a,b,”\n”)
coroutine.yield (a+b,b-a)
end)
print( coroutine. resume(co,20, 10)) --> 10 20
true 30 10
- Lua的多任务机制——协程(coroutine)
- [Unity] Unity的lua项目中模拟每帧运行一次的协程
- ngx_lua中的协程调度(三)
- Lua基础之coroutine(协程)
- 【Lua学习笔记】Lua中协程的使用
- Lua协程(coroutine)的基本知识
- Lua的协程和协程库详解
- Lua的协程基础
- Lua协程(coroutine)程序运行分析
- 基于lua协程的AI服务实现
- ngx_lua中的协程调度(六)之ngx_http_lua_run_posted_thread
- Lua 协程
- Lua语言学习之协程
- Lua协程
- 实现lua协程
- Lua学习笔记(六):协程
- 【深入Lua】理解Lua中最强大的特性-coroutine(协程)
- [转]skynet Lua中的协程
- Lua_ uLua协程_021
- Lua的协程(coroutine)