美文网首页js css html
545.【Lua】协程(Coroutine)

545.【Lua】协程(Coroutine)

作者: 七镜 | 来源:发表于2023-01-09 22:28 被阅读0次

    从多线程(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))
    

    从协程的角度看,在挂起期间发生的活动都发生在协程调用 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))
    

    相关文章

      网友评论

        本文标题:545.【Lua】协程(Coroutine)

        本文链接:https://www.haomeiwen.com/subject/wigucdtx.html