Coroutine 协同程序 - 图1

创建协程

  1. -- *** 协程的创建 *** --
  2. fun = function()
  3. print(123)
  4. end
  5. -- 常用方式
  6. co = coroutine.create(fun)
  7. -- 协程的本质是一个线程对象
  8. print(co) --> thread: 00000000007ce248
  9. print(type(co)) --> thread
  10. co2 = coroutine.wrap(fun)
  11. print(co2) --> function: 0000000000a39720
  12. print(type(co2)) --> function
  13. -- *** 协程的运行 *** --
  14. -- 第一种方式 对应 通过create创建的协程
  15. coroutine.resume(co) --> 123
  16. -- 第二种方式 对应 通过wrap创建的协程
  17. co2() --> 123
  18. -- *** 协程的挂起 *** --
  19. fun2 = function()
  20. local i = 1
  21. while true do
  22. print(i)
  23. i = i + 1
  24. -- 协程的挂起函数
  25. coroutine.yield(i)
  26. end
  27. end
  28. co3 = coroutine.create(fun2)
  29. -- 默认第一个返回值:协程是否启动成功
  30. -- 第二个返回值为yield中的返回值
  31. isOk, tempI = coroutine.resume(co3) --> 1
  32. print(isOk, tempI) --> true 2
  33. isOk, tempI = coroutine.resume(co3) --> 2
  34. print(isOk, tempI) --> true 3
  35. isOk, tempI = coroutine.resume(co3) --> 3
  36. print(isOk, tempI) --> true 4
  37. -- 这种方式的协程也有返回值,没有 协程是否启动成功 的返回值
  38. co4 = coroutine.wrap(fun2)
  39. print("返回值:" .. co4())
  40. print("返回值:" .. co4())
  41. print("返回值:" .. co4())
  42. --[[
  43. output:
  44. 1
  45. 返回值:2
  46. 2
  47. 返回值:3
  48. 3
  49. 返回值:4
  50. --]]
  51. -- ** 协程的状态 ** --
  52. -- coroutine.status(协程对象)
  53. --[[
  54. dead 结束
  55. suspended 暂停
  56. running 进行中
  57. --]]
  58. print(coroutine.status(co3)) --> suspended
  59. print(coroutine.status(co)) --> dead
  60. -- 该函数能够得到当前正在运行的协程的线程号
  61. coroutine.running()