【Lua】协程(Coroutine)

简介: 【Lua】协程(Coroutine)

从多线程(multithreading) 的角度看,协程(coroutine)与线程(thread)类似:协程是一系列的可执行语句,拥有自己的栈、局部变量和指令指针,同时协程又与其他协程共享了全局变量和其他几乎一切资源。线程与协程的主要区别在于,一个多线程程序可以并行运行多个线程,而协程却需要彼此协作地运行,即在任意时刻只能有一个协程运行,且只有当正在运行的协程显示地要求被挂起(suspend)时其执行才会暂停。


协程的真正强大之处在于函数 yeild,该函数可以让一个运行中的协程挂起自己,然后在后续恢复运行,例如:

co = coroutine.create(function ()
          for i = 1, 10 do
            print("co", i)
            coroutine.yield()
          end
        end)



  • 其中,协程进行了一个循环,在循环中输出数字并在每次打印后挂起。当唤醒协程后,他就会开始执行直到遇到第一个 yield:
coroutine.resume(co)


  • 此时,如果我们查看协程状态,会发现协程处于挂起状态,因此可以再次恢复运行:
print(coroutine.status(co))


image.png


从协程的角度看,在挂起期间发生的活动都发生在协程调用 yield 期间。当我们唤醒协程时,函数 yield 才会最终返回,然后协程会继续执行直到写一个 yield 或执行结束:

coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co) -- 不输出任何数据


  • 在最后一次调用 resume 时,协程体执行完毕并返回,不输出任何数据。如果我们视图再次唤醒它,函数 resume 将返回 false 及一条错误信息:
print(coroutine.resume(co))


image.png

目录
相关文章
|
5月前
|
C# Python
[√]lua 协程
[√]lua 协程
36 1
|
2月前
|
调度 Python
什么是Python中的协程(Coroutine)?如何使用`async`和`await`进行协程编程?
什么是Python中的协程(Coroutine)?如何使用`async`和`await`进行协程编程?
27 0
|
4月前
|
Python
Python 的异步编程:什么是协程(Coroutine)和生成器(Generator)之间的区别?
Python 的异步编程:什么是协程(Coroutine)和生成器(Generator)之间的区别?
|
4月前
|
API 调度 Python
Python 高级主题:解释 Python 中的协程(Coroutine)是什么?
Python 高级主题:解释 Python 中的协程(Coroutine)是什么?
|
4月前
|
Go 调度 C#
Unity——协程(Coroutine)
Unity——协程(Coroutine)
|
9月前
|
设计模式 Java 编译器
Kotlin协程(Coroutine)
Kotlin协程(Coroutine)
76 0
|
10月前
|
安全
c++20 协程(coroutine)
c++20 协程(coroutine)
171 0
|
11月前
Lua笔记协程
Lua笔记协程
49 0