微信登录

协同程序挂起 - coroutine.yield 函数 - 暂停协程

Lua 协同程序挂起 - coroutine.yield 函数 - 暂停协程

在 Lua 编程中,协同程序(coroutine)是一种强大的控制结构,它允许程序在执行过程中暂停和恢复。而 coroutine.yield 函数则是实现协同程序挂起的关键。本文将详细介绍 coroutine.yield 函数的作用、使用方法,并通过示例代码展示其实际应用。

协同程序概述

协同程序是一种比线程更加轻量级的并发机制。与线程不同,协同程序的执行是由程序员手动控制的,它在同一时间只会有一个协同程序在运行,并且可以在需要的时候暂停和恢复执行。Lua 中的协同程序主要有三种状态:挂起(suspended)、运行(running)和死亡(dead)。

coroutine.yield 函数的作用

coroutine.yield 函数用于暂停当前正在运行的协同程序,并将控制权交还给调用 coroutine.resume 的地方。当协同程序被暂停时,它会保留当前的执行状态,包括局部变量的值等,以便后续恢复执行。

coroutine.yield 函数可以接受任意数量的参数,这些参数会作为 coroutine.resume 函数的额外返回值。

示例代码

下面是一个简单的示例,演示了如何使用 coroutine.yield 函数暂停和恢复协同程序:

  1. -- 定义一个协同程序函数
  2. local co = coroutine.create(function()
  3. print("协同程序开始执行")
  4. -- 第一次挂起协同程序
  5. local value1 = coroutine.yield("第一次挂起的值")
  6. print("协同程序恢复执行,接收到的值:", value1)
  7. -- 第二次挂起协同程序
  8. local value2 = coroutine.yield("第二次挂起的值")
  9. print("协同程序再次恢复执行,接收到的值:", value2)
  10. print("协同程序执行结束")
  11. end)
  12. -- 第一次启动协同程序
  13. print("第一次调用 coroutine.resume")
  14. local status1, result1 = coroutine.resume(co)
  15. print("协同程序状态:", status1)
  16. print("协同程序返回的值:", result1)
  17. -- 第二次恢复协同程序,并传递一个值
  18. print("第二次调用 coroutine.resume")
  19. local status2, result2 = coroutine.resume(co, "传递给第一次挂起后的值")
  20. print("协同程序状态:", status2)
  21. print("协同程序返回的值:", result2)
  22. -- 第三次恢复协同程序,并传递一个值
  23. print("第三次调用 coroutine.resume")
  24. local status3, result3 = coroutine.resume(co, "传递给第二次挂起后的值")
  25. print("协同程序状态:", status3)
  26. print("协同程序返回的值:", result3)

代码解释

  1. 协同程序函数的定义:使用 coroutine.create 函数创建一个协同程序,该函数接受一个匿名函数作为参数,该匿名函数就是协同程序的主体。
  2. 第一次启动协同程序:调用 coroutine.resume(co) 启动协同程序,协同程序开始执行,直到遇到第一个 coroutine.yield 函数,此时协同程序暂停,并将 "第一次挂起的值" 作为返回值传递给 coroutine.resume
  3. 第二次恢复协同程序:调用 coroutine.resume(co, "传递给第一次挂起后的值") 恢复协同程序的执行,并将 "传递给第一次挂起后的值" 作为参数传递给 coroutine.yield 函数的返回值。协同程序继续执行,直到遇到第二个 coroutine.yield 函数,再次暂停。
  4. 第三次恢复协同程序:调用 coroutine.resume(co, "传递给第二次挂起后的值") 恢复协同程序的执行,并将 "传递给第二次挂起后的值" 作为参数传递给 coroutine.yield 函数的返回值。协同程序继续执行,直到结束。

运行结果

  1. 第一次调用 coroutine.resume
  2. 协同程序开始执行
  3. 协同程序状态: true
  4. 协同程序返回的值: 第一次挂起的值
  5. 第二次调用 coroutine.resume
  6. 协同程序恢复执行,接收到的值: 传递给第一次挂起后的值
  7. 协同程序状态: true
  8. 协同程序返回的值: 第二次挂起的值
  9. 第三次调用 coroutine.resume
  10. 协同程序再次恢复执行,接收到的值: 传递给第二次挂起后的值
  11. 协同程序执行结束
  12. 协同程序状态: false
  13. 协同程序返回的值: cannot resume dead coroutine

总结

函数 作用
coroutine.yield 暂停当前正在运行的协同程序,并将控制权交还给调用 coroutine.resume 的地方。可以接受任意数量的参数,这些参数会作为 coroutine.resume 函数的额外返回值。
coroutine.resume 启动或恢复协同程序的执行。可以接受额外的参数,这些参数会作为 coroutine.yield 函数的返回值。

通过使用 coroutine.yield 函数,我们可以灵活地控制协同程序的执行流程,实现复杂的异步操作和状态管理。希望本文对你理解 Lua 协同程序的挂起机制有所帮助。

协同程序挂起 - coroutine.yield 函数 - 暂停协程