Lua协程coroutine库用法

一.学习Lua协程的目的

1.可以更好的学习和掌握一些Lua框架比如ToLua,因为这些框架可能使用Lua协程

2.Lua协程是Lua语言的一部分,虽然不常用,掌握后可以在遇到某些需求时可以想到用Lua协程可以解决问题。

二.Lua协程概念

和Unity协程的概念类似,Lua协程是可以让函数暂停,在暂停处继续执行方法的机制。

三.协程API

3.1 coroutine.create(func)

接收一个function参数,返回一个thread类型变量(下文称协程对象)

Lua 复制代码
    local co = coroutine.create(function ()
        print("co execute")
    end)
    print(co)

3.2 coroutine.status(co)

接收一个协程对象,返回协程状态。一个协程有suspended, running, and dead三种状态。通过coroutine.create创建的协程,其初始状态为suspended,意味着其函数体不会自动执行,下面例子展示了协程的三种状态

Lua 复制代码
    co = coroutine.create(function ()
        print("co execute")
        print("co 函数体内status:",coroutine.status(co))
    end)
    print("co create后status:",coroutine.status(co))
    coroutine.resume(co)
    print("co resume后status:",coroutine.status(co))

3.3 coroutine.resume(co)

coroutine.resume方法恢复一个协程的执行,使其状态从suspended变为running

3.4 coroutine.yield()

挂起一个协程,使其状态变为suspended

Lua 复制代码
   co = coroutine.create(function ()
        print("co execute before yield")
        coroutine.yield()
        print("co execute after yield")
    end)

    coroutine.resume(co)
    function funcResume()
        print("funcResume called")
        coroutine.resume(co)
    end
cs 复制代码
        if (GUI.Button(new Rect(50, 50, 120, 45), "DoFile"))
        {
            //strLog = "";
            LuaFunction luaFunc = lua.GetFunction("funcResume");
            if (luaFunc != null)
            {
                luaFunc.BeginPCall();
                luaFunc.PCall();
                luaFunc.EndPCall();
            }
        }

参考:

Coroutine Basics

相关推荐
长不胖的路人甲3 小时前
Serial 串行、Parallel 并行、CMS 并发收集器
java·开发语言·jvm
麻瓜老宋5 小时前
AI开发C语言应用按步走,表达式计算器calc的第二十四步,结束开发,生成calc 用法指南
c语言·开发语言·atomcode
霸道流氓气质5 小时前
分布式系统中接口时序不确定性处理
java·开发语言·分布式
库克克5 小时前
【C++】C++11 包装器function 与 绑定器 bind
开发语言·c++
多加点辣也没关系5 小时前
JavaScript|第30章:事件机制
开发语言·javascript
小大宇5 小时前
python milvus 案例
开发语言·python·milvus
Gauss松鼠会5 小时前
【GaussDB】GaussDB锁阻塞源头查询
java·开发语言·前端·数据库·算法·gaussdb·经验总结
mingo_敏6 小时前
DeepAgents : 后端(Backends)
java·开发语言
mabing9936 小时前
Qt QMessageBox、QDialogButtonBox中英文翻译动态切换
开发语言·qt
Sagittarius_A*6 小时前
【RCELABS】Level 17~18 —— PHP命令执行函数与环境变量注入
开发语言·安全·web安全·靶场·php·rce