Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。

协同是非常强大的功能

协同程序并不是线程,只是类似于同步线程

线程与协同程序的主要区别在于,一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作的运行。

在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只有在明确的被要求挂起的时候才会被挂起。

基本语法

方法 描述
coroutine.create() 创建 coroutine,返回 coroutine, 参数是一个函数,当和 resume 配合使用的时候就唤醒函数调用
coroutine.resume() 重启 coroutine,和 create 配合使用
coroutine.yield() 挂起 coroutine,将 coroutine 设置为挂起状态,这个和 resume 配合使用能有很多有用的效果
coroutine.status() 查看 coroutine 的状态 注:coroutine 的状态有三种:dead,suspended,running
coroutine.wrap() 创建 coroutine,返回一个函数,一旦你调用这个函数,就进入 coroutine,和 create 功能重复
coroutine.running() 返回正在跑的 coroutine,一个 coroutine 就是一个线程,当使用running的时候,就是返回一个 corouting 的线程号

用法

  1. co = coroutine.create(
  2. function(i)
  3. print(i);
  4. end
  5. )
  6. coroutine.resume(co, 1) -- 1
  7. print(coroutine.status(co)) -- dead
  8. print("----------")
  9. co = coroutine.wrap(
  10. function(i)
  11. print(i);
  12. end
  13. )
  14. co(1)
  15. print("----------")
  16. co2 = coroutine.create(
  17. function()
  18. for i=1,10 do
  19. print(i)
  20. if i == 3 then
  21. print(coroutine.status(co2)) --running
  22. print(coroutine.running()) --thread:XXXXXX
  23. end
  24. coroutine.yield()
  25. end
  26. end
  27. )
  28. coroutine.resume(co2) --1
  29. coroutine.resume(co2) --2
  30. coroutine.resume(co2) --3
  31. print(coroutine.status(co2)) -- suspended
  32. print(coroutine.running())
  33. print("----------")

输出

Lua-协同程序coroutine - 图1

传参

当create一个coroutine的时候就是在新线程中注册了一个事件。

当使用resume触发事件的时候,create的coroutine函数就被执行了,当遇到yield的时候就代表挂起当前线程,等候再次resume触发事件。

而传参就是在yield的时候进行操作,当协同程序被挂起的时候,yield中的参数便会传给调用当前协同程序的resume,而再次调用协同程序的resume的参数则会传给yield。

示例:

  1. function demo(req)
  2. print('第一次执行:',req)
  3. --拿到主线程传值
  4. req=coroutine.yield(1,2)
  5. print('第二次执行:',req)
  6. end
  7. local c=coroutine.create(demo)
  8. print('线程返回值:',coroutine.resume(c,"demo"))
  9. coroutine.resume(c,"demodemo")

输出:

Lua-协同程序coroutine - 图2