Lua知识点五 协同程序

来源:互联网 发布:mac修容粉怎么用 编辑:程序博客网 时间:2024/06/06 15:53

协同的基础

Lua的所有协同函数存放于coroutine table中。create函数用于创建新的协同程序,其只有一个参数:一个函数,即协同程序将要运行的代码。若一切顺利,返回值为thread类型,表示创建成功。
协同有三个状态:挂起态(suspended)、运行态(running)、停止态(dead)。
co = coroutine.create(function ()
print(“hi”)
end)
print(co)
print(coroutine.status(co)) –挂起态 suspended
coroutine.resume(co) –运行态 hi
print(coroutine.status(co)) –停止态 dead
Lua的协同称为不对称协同(asymmetric coroutines),指“挂起一个正在执行的协同函数”与“使一个被挂起的协同再次执行的函数”是不同的,有些语言提供对称协同(symmetric coroutines),即使用同一个函数负责“执行与挂起间的状态切换”

管道和过滤器

协同最具代表性的例子是用来解决生产者-消费者问题。
管道的方式下,每一个任务在独立的进程中运行,而协同方式下,每个任务运行在独立的协同代码中。
协同模式下,任务间的切换代价较小,与函数调用相当,因此读写可以很好的协同处理。

用作迭代器的协同

协同的一个关键特征是它可以不断颠倒调用者与被调用者之间的关系,这样我们毫无顾虑的使用它实现一个迭代器,而不用保存迭代函数返回的状态。

非抢占式多线程

Lua中的协同是一协作的多线程,每一个协同等同于一个线程,yield-resume可以实现在线程中切换。

原创粉丝点击