协程

lua将所有关于协同程序的函数放置在一个名为“coroutine”的table中。

create  ///创建新的协同程序

例:

co = coroutine.create(function () print("hi")  end)

print(co)  --> thread: 0x8071d98

一个协程可以处于4种不同的状态:挂起(suspended)、运行(running)、死亡(dead)、正常(normal)。创建一个协程时,它处于挂起状态。也就是说协程在被创建时不会自动执行其内容。可以通过status来检查协程状态:

print(coroutine.status(co))  -->suspended

resume用于启动或再启动一个协程的执行,并将其状态由挂起改为运行:

coroutine.resume(co)   -->hi

由于创建的协程只是简单的print,上面语句结束后就处于死亡状态,无法返回了

print(coroutine(co))  -->dead

yield:可以让一个运行中的协程挂起,再之后可以恢复它的运行。

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

现在唤醒它时,它将执行到第一个yield:

coroutine.resume(co)  -->co 1

此时检查其状态,可以发现协程处于挂起状态,因此可以再次恢复运行:

print(coroutine.status(co))  -->suspended

只有恢复了协程的执行时,yield调用才最终返回,然后协程继续执行,直到下一个yield或执行结束:

coroutine.resume(co)  -->co 2
coroutine.resume(co)  -->co 3
...

最后一次调用协程时,协程内容已经执行完毕并已返回,如果再尝试恢复它的执行,resume将返回false及一条错误信息。

协程A唤醒另一个协程B时,A的状态既不是挂起,也不是结束,称为正常状态。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 轻量级线程:协程 在常用的并发模型中,多进程、多线程、分布式是最普遍的,不过近些年来逐渐有一些语言以first-c...
    Tenderness4阅读 11,491评论 2 10
  • 原文链接:https://github.com/EasyKotlin 在常用的并发模型中,多进程、多线程、分布式是...
    JackChen1024阅读 13,675评论 3 23
  • 本文主要介绍协程的用法, 以及使用协程能带来什么好处. 另外, 也会粗略提一下协程的大致原理.本文的意义可能仅仅是...
    登高而望远阅读 35,479评论 18 140
  • Coroutine in Python 引言: 本文出自David Beazley 的关于协程的PPT,现在笔者将...
    LumiaXu阅读 5,573评论 4 8
  • 我们首先介绍一下什么是协程、然后详细介绍一下coroutine库,然后介绍一下协程的简单用法,最后介绍一下协程的复...
    17269780ceda阅读 4,112评论 0 6

友情链接更多精彩内容