wordpress 网站地图,苏州网站seo优化,深圳广告设计与制作公司,重庆网站制作招聘Lua 协同程序(Coroutine)
定义
Lua 协同程序(Coroutine)与线程类似#xff1a;拥有独立的堆栈、局部变量、指令指针#xff0c;同时又与其它协同程序共享全局变量和其它大部分东西。
协同程序可以理解为一种特殊的线程#xff0c;可以暂停和恢复其执行#xff0c;从而允…Lua 协同程序(Coroutine)
定义
Lua 协同程序(Coroutine)与线程类似拥有独立的堆栈、局部变量、指令指针同时又与其它协同程序共享全局变量和其它大部分东西。
协同程序可以理解为一种特殊的线程可以暂停和恢复其执行从而允许非抢占式的多任务处理。协同是非常强大的功能但是用起来也很复杂。
线程和协同程序区别
主要区别在于一个程序可以同时运行几个线程而协同程序却需要彼此协作的运行。 在任一指定时刻只有一个协同程序在运行并且这个正在运行的协同程序只有在明确的被要求挂起的时候才会被挂起。
线程协程调度方式操作系统进行抢占式调度非抢占式调度由程序员控制并发并发执行同时运行多个协作运行同时运行一个内存占用独立堆栈开销大共享堆栈、开销小数据共享共享内存空间通过参数传递调试难以调试相对简单
使用
协同程序由 coroutine 模块提供支持。
方法描述coroutine.create()创建 coroutine返回 coroutine 参数是一个函数当和 resume 配合使用的时候就唤醒函数调用coroutine.resume()重启 coroutine和 create 配合使用coroutine.yield()挂起 coroutine将 coroutine 设置为挂起状态这个和 resume 配合使用能有很多有用的效果coroutine.status()查看 coroutine 的状态 注三种状态deadsuspendedrunningcoroutine.wrap创建 coroutine返回一个函数一旦你调用这个函数就进入 coroutine和 create 功能重复coroutine.running()返回正在跑的 coroutine一个 coroutine 就是一个线程当使用running的时候就是返回一个 coroutine 的线程号
代码示例
function foo()print(协同程序 foo 开始执行)local value coroutine.yield(暂停 foo 的执行)print(协同程序 foo 恢复执行传入的值为: .. tostring(value))print(协同程序 foo 结束执行)
end-- 创建协同程序
local co coroutine.create(foo)-- 启动协同程序
local status, result coroutine.resume(co)
print(result) -- 输出: 暂停 foo 的执行-- 恢复协同程序的执行并传入一个值
status, result coroutine.resume(co, 42)
print(result) -- 输出: 协同程序 foo 恢复执行传入的值为: 42代码输出结果
协同程序 foo 开始执行
暂停 foo 的执行
协同程序 foo 恢复执行传入的值为: 42
协同程序 foo 结束执行
nil