当前位置: 首页 > news >正文

Lua 协程池

协程池

在 使用 Lua 协程模拟 Golang 的 go defer 编程模式 中介绍了 Lua 协程的使用,模仿 golang 封装了下

还可以做进一步的优化

原来的 go 函数是这样实现的:

function go(_co_task)local co = coroutine.create(function(_co_wrap)_co_task(_co_wrap)invoke_defer_handlers(_co_wrap, {ok=true}) -- 正常退出end)local cowrap = { co = co, defer_handlers = {} } ---@type co_wrapcoroutine_resume(cowrap)
end

go一次,均coroutine.create创建一根协程

阅读了 skynet 相关使用协程的代码,发现 skynet 使用了协程池

因此可以借鉴过来

具体实现

引入协程池的类似代码如下:

---@type co_wrap[]
local coroutine_pool = setmetatable({}, { __mode = "kv" })
local coroutine_max_idle_num = 10 -- 协程池,最大空闲个数function go(_co_task)local co_wrap_0 = table.remove(coroutine_pool) ---@type co_wrapif not co_wrap_0 thenlocal co = coroutine.create(function()while true dolocal co_wrap_2, co_tesk_2 = coroutine.yield()co_tesk_2(co_wrap_2)invoke_defer_handlers(_co_wrap, {ok=true}) -- 正常退出co_tesk_2 = nilif #coroutine_pool < coroutine_max_idle_num thencoroutine_pool[#coroutine_pool + 1] = { co = co_wrap_2.co, defer_handlers = {} }co_wrap_2 = nilelseco_wrap_2 = nilreturnendendend)continue.resume(co)local co_wrap_1 = { co = co, defer_handlers = {} } ---@type co_wrapcoroutine_resume(co_wrap_1, co_wrap_1, _co_task)else-- 复用协程coroutine_resume(co_wrap_0, co_wrap_0, _co_task)end
end
  • go 函数,pop coroutine_pool 队尾,如果不为空,则有协程可以复用;否则新建协程处理
  • 因为协程需要复用,因此需要解耦 _co_task ,可以通过 resume 传递过去
  • 还可以设置协程池大小。进而判断,压入 coroutine_pool 继续 yield 等待下个任务;还是直接结束本协程
http://www.lryc.cn/news/349087.html

相关文章:

  • [Linux][网络][协议技术][DNS][ICMP][ping][traceroute][NAT]详细讲解
  • Android 集成Bugly完成线上的异常Exception收集及处理
  • Redis——Redis的数据库结构、删除策略及淘汰策略
  • 【Vue3笔记03】Vue3项目工程中使用vue-router路由
  • 并行执行的4种类别——《OceanBase 并行执行》系列 4
  • 函数练习.
  • Git 分支命令操作详解
  • 十二生肖Midjourney绘画大挑战:释放你的创意火花
  • 【C++】priority_queues(优先级队列)和反向迭代器适配器的实现
  • Go语言函数
  • 如何使用EasyExcel导入百万数据
  • 【解决】Unity Build 应用程序运行即崩溃问题
  • C++数据结构——红黑树
  • Java并发编程:学习路线图
  • 算法_前缀和
  • C语言(指针)7
  • 线程纵横:C++并发编程的深度解析与实践
  • 在阿里云服务器上安装MySQL
  • 国标GB28181协议EasyCVR视频汇聚平台获取设备录像仅展示部分片段的原因排查
  • Java的类和对象(一)—— 初始类和对象,this关键字,构造方法
  • 富格林:曝光虚假套路规避亏损
  • 数据源网站分享
  • Flutter 中的 CupertinoAlertDialog 小部件:全面指南
  • 【RAG 论文】UPR:使用 LLM 来做检索后的 re-rank
  • 安全风险 - 如何解决 setAccessible(true) 带来的安全风险?
  • 创建继承自QObject的线程:一个详细指南
  • java项目之智慧图书管理系统设计与实现(springboot+vue+mysql)
  • 分享一些人生道理,希望能对大家有所帮助!
  • 【设计模式】JAVA Design Patterns——Abstract-document(抽象文档模式)
  • 5.13网络编程