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作为主函数的参数传入。运行该函数就是运行协程。

示例代码

  1. 创建并运行一个协程,并向主函数传入参数 ```lua local co = coroutine.create(function(arg1, arg2) print(‘主函数运行,传入参数:’, arg1, arg2) coroutine.yield() end)

status = coroutine.resume(co, 1, 2)

print(status)

  1. ![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. 2. 创建一个协程,获取协程挂起时返回的结果
  3. ```lua
  4. local co = coroutine.create(function(arg1, arg2)
  5. print('主函数运行,传入参数:', arg1, arg2)
  6. coroutine.yield(10, 20)
  7. end)
  8. status, res1, res2 = coroutine.resume(co, 1, 2)
  9. print(status, res1, res2)

image.png