zoukankan      html  css  js  c++  java
  • Lua的协程

    Lua通过调用coroutine.create(function)创建一个协程。一个协程有4个状态,suspended,running,normal,和dead。可以使用coroutine.status(co)来判断一个协程的状态,默认一个协程刚被创建出来时,它的状态是suspended:

    co = coroutine.create(function() print("hi") end)
    print(coroutine.status(co)) --> suspended
    

    可以使用coroutine.resume(co)来启动一个协程,使其进入running状态,协程执行完毕之后,就会变成dead状态:

    coroutine.resume(co) --> hi
    print(coroutine.status(co)) --> dead
    

    yield函数用来暂停一个协程的执行,coroutine.resume函数会执行到yield处暂停返回,第一个返回值为true说明没有发生错误,其他返回值是传给yield的参数:

    local co = coroutine.create(function(a, b)
        print("hi")
        coroutine.yield(a + b, a - b)
    end)
    
    print(coroutine.resume(co, 20, 10))
    

    运行结果如下:

    类似地,yield函数会在resume调用之后返回,然后继续执行协程,返回值为传给resume的参数:

    local co = coroutine.create(function(a, b)
        print("hi")
        print(coroutine.yield(a + b, a - b))
    end)
    
    coroutine.resume(co, 1, 2)
    coroutine.resume(co, 20, 10)
    

    运行结果如下:

    当然,当协程执行完毕时,协程的返回值将作为resume函数的返回值返回:

    local co = coroutine.create(function(a, b)
        print("hi")
        print(coroutine.yield(a + b, a - b))
        return "hello coroutine"
    end)
    
    print(coroutine.resume(co, 1, 2))
    print(coroutine.resume(co, 20, 10))
    

    运行结果如下:

    通过使用resume和yield,我们可以在不断执行resume的过程中了解协程内部的状态(通过yield函数携带的参数),相应地,在不断resume的过程中,也能在协程不同的阶段传递不同的参数给协程内部(通过resume函数携带的参数)。

    如果你觉得我的文章有帮助,欢迎关注我的微信公众号(大龄社畜的游戏开发之路-

  • 相关阅读:
    ubuntu中,终端命令行快速打开html文件方法
    Python清空文本内容的两种方法
    科大教学日历
    MJ瀑布流学习笔记
    iOS搜索框
    异步IO
    yield
    ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
    15个常用的javaScript正则表达式
    Linux 升级 Python 至 3.x
  • 原文地址:https://www.cnblogs.com/back-to-the-past/p/15018200.html
Copyright © 2011-2022 走看看