Lua支持协程(coroutine
),一个协程代表了一段独立的执行线程,与多线程系统中的线程区别在于,协程仅在显示调用一个 yield() 函数时才会挂起当前执行。
协程相关函数
- coroutine.create( )
- coroutine.resume( )
- coroutine.yield( )
- coroutine.wrap( )
- coroutine.status( )
- coroutine.running( )
- coroutine.isyieldable( )
coroutine.create( main func )
根据main func
主函数创建一个协程,并返回该协程,类型为thread
coroutine.resume( co, [arg, …] )
开启或继续协程 co 的运行,当第一次运行一个协程时,会从协程主函数开始运行,arg
会作为主函数的参数传入。
- 第一次调用 resume( ) ,
arg
会作为主函数参数 - 第二次及之后调用 resume( ) ,
arg
会作为 yield( ) 的返回值 - resume( ) 第一个返回值是协程执行状态,如果协程执行没有错误返回true
- resume( ) 第二个及之后的返回值,是在主函数中调用 yield( ) 所传入的参数
coroutine.yield( [arg, …] )
挂起正在调用的协程,传入的arg
会被下一次resume( )时返回
coroutine.wrap( main func, [arg, …] )
根据main func
函数创建一个协程,并返回一个函数,arg
作为主函数的参数传入。运行该函数就是运行协程。
示例代码
- 创建并运行一个协程,并向主函数传入参数 ```lua local co = coroutine.create(function(arg1, arg2) print(‘主函数运行,传入参数:’, arg1, arg2) coroutine.yield() end)
status = coroutine.resume(co, 1, 2)
print(status)
![image.png](https://cdn.nlark.com/yuque/0/2022/png/23037810/1655646620445-42631b72-aba3-4e96-b7a4-a59b7cb62bf5.png#clientId=u16ae8e45-94f2-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=48&id=u4c579907&margin=%5Bobject%20Object%5D&name=image.png&originHeight=48&originWidth=750&originalType=binary&ratio=1&rotation=0&showTitle=false&size=1848&status=done&style=none&taskId=u68fae6db-4fb6-426f-8e97-6d3da167ce6&title=&width=750)
2. 创建一个协程,获取协程挂起时返回的结果
```lua
local co = coroutine.create(function(arg1, arg2)
print('主函数运行,传入参数:', arg1, arg2)
coroutine.yield(10, 20)
end)
status, res1, res2 = coroutine.resume(co, 1, 2)
print(status, res1, res2)