不断的查阅资料, 不断的学习, 阅读 lua代码. 一个人做开发其实是一个痛苦的过程,非常考验毅力和耐心。不过好在经过几个月晚上的学习积累, 已经渐入佳境。觉得有必要做一下笔记了。下面记录下踩过的一些坑。

第一个坑

原计划将sqlite数据库封装完全异步化的, 实现思路, 使用 uv_queue_work + 队列 来实现异步的数据库操作, 以达到利用一个独立线程来操作数据库的目的。 起初 我觉得通过 lua_newthread 创建一个线程, 然后在这个线程不和 的父线程又任何交集的情况下,应该会是线程安全的. 虽然没有把握,但是还是去阅读一下代码比较稳妥。 通过阅读 lua_pushlstring函数发现, 它会将长度少于40字节的字符串哈希后,并且只存保存一份。 这里用到了一个全局状态机来管理这些短字符串, 好吧 lua_newthread 并不是线程安全的. 而采用序列化的方法在lua线程之间交换数据, 对小数据包还好,但数据库的话可能一次查询大量数据, 序列化和反序列化的开销会非常可观,这一块暂时放弃. 后续有空再寻找其它方案。

第二个坑

libuv 的uv_async_send 和回调的执行并不是严格一对一关系, 多个连续的uv_async_send 只会触发一次 回调, 解决办法是 使用一个队列保存uv_async_send 的数据, 然后在回调里面遍历取出所有node 去操作.

关于协程化.

尽管lua并没有实现对称式协程, 但借助libuv,我们完全可以做出对称式协程的效果。 但我们进行一个异步IO操作的时候,挂起当前协程, 并让这个libuv对象持有它, 在 libuv回调的时候去恢复它即可. 我们设计的时候要遵循以下几条规则.

  1. uv_run 必须运行在主线程, 因为我们在事件回调的时候 lua_resume 的from 统一指定为 mainthread.
  2. 任何通过io操作挂起的协程只能被libuv的对应的io回调来恢复。
  3. tcp连接 的收到数据回调触发后要立即调用 uv_read_stop 来停止获取数据到达事件. 避免resume 栈错乱.
  4. 定时器封装的时候, 指定一个回调函数, 每次回调中使用 lua_newthread创建一个协程去执行该函数, 避免 重复resume协程.
  5. 借助 uv_async_send 来,实现了一个类似go语言的channel对象.
  6. UDP由于没有连接, 因此 需要为每一个数据包到达去创建一个协程. 类似 定时器的处理方法.

暂时写这么多。

lua+libuv的一些开发心得相关推荐

  1. 软件开发心得点滴记录

    软件开发心得点滴记录 一见 创建日期:2013/6/27 1. 前言 自从2002年大学毕业后一直沉浸于软件开发之路,平时喜欢思考和归纳,时常会产生一点心得和想法,回想起来是一笔宝贵的财富,只可惜陆陆 ...

  2. 一个菜鸟程序员的游戏开发心得

    对于一个只在大学期间学习了JavaScript,实习期间学习了点HTML.CSS的菜鸟,做游戏对我而言是一件想都不敢想的事情,后有幸被公司安排参与一款HTML5游戏的开发,才使我真正第一次与游戏来了次 ...

  3. UI组件库从1到N开发心得-组件篇

    正文 距离第一篇UI组件库文章发布已经过去3个月了,在此期间利用零零散散的时间持续更新owl-ui组件库,目前owl-ui移动端组件库已经更新3大类(基础.表单.弹出层)9种组件(Button.Tab ...

  4. Android深度探索(卷1)HAL与驱动开发 心得体会 第十章 嵌入式Linux的调用技术

    Android深度探索(卷1)HAL与驱动开发 心得体会 第十章  嵌入式Linux的调用技术 对于复杂的Linux驱动以及HAL等程序库,需要使用各种方法对其进行调试.例如,设置断点,逐步跟踪代码. ...

  5. 《并行计算的编程模型》一1.10 MPI开发心得

    1.10 MPI开发心得 与其他的编程方法一样,MPI编程需要了解MPI特性,只有掌握MPI编程方法的优点和缺点,才能编写高效的MPI程序.对MPI最重要的认识是MPI属于一种函数库.MPI操作需要至 ...

  6. 安卓版App开发心得

    为什么80%的码农都做不了架构师?>>>    从2016年4月到6月主要做的工作是网站的开发,而6月到现在2016年8月初,主要做的工作是Android和IOS两种App的开发,又 ...

  7. 2022年10月deepin 20.7.1 谈谈我们的N卡驱动开发心得

    deepin 20.7.1 即将到来之际,各位小伙伴在参与内测的过程中,有没有发现安装N卡驱动时不同寻常的变化呢? 20.7.1版本可以根据当前你机器的上NVIDIA显卡,自动匹配合适的闭源驱动版本进 ...

  8. Android智能硬件开发心得总结(二)

    Android智能硬件开发心得总结(一) 6.关于屏幕显示 每次一个新项目的开发,我所做的第一件事就是确定所选定显示屏的型号规格,然后将规格书发给主板供应商让其先调屏参. 调屏参是很可能会出现无法点亮 ...

  9. 游戏开发心得——书籍篇——《游戏引擎框架》-导论

    游戏开发心得--书籍篇--<游戏引擎框架>-导论 FOR THE SIGMA FOR THE GTINDER FOR THE ROBOMASTER 简介: 学习<游戏引擎框架> ...

最新文章

  1. 【Python】用 Python 帮财务小妹生成 Excel 报表,小妹直说一辈子。。。
  2. UML大战需求分析阅读笔记——01
  3. JQ获取CKeditor的值
  4. json最大长度限制_api接口返回动态的json格式?我太难了,尝试一下 linq to json
  5. python抽取指定url页面的title_Python使用scrapy爬虫,爬取今日头条首页推荐新闻
  6. 图的最短路算法(Dijkstra和Floyd-Warshall)
  7. linux系统awk、sed,Linux系统 linux awk sed
  8. 编译OpenJDK8-u332:/bin/sh: 1: [: -a: unexpected operator/line 0: [: too many arguments
  9. linux执行.sql文件,Linux下执行Oracle的sql脚本
  10. matlab covar,delta CoVaR 系统性风险指标计算
  11. 计算机二级 MSOffice 考试历年真题精选
  12. 元胞自动机模型之格子气自动机模拟气体扩散模型
  13. asp+access实现增删改查
  14. 这个机器人还原魔方,只需八秒!
  15. JAVA中多态的理解
  16. Thinkphp6调用企业微信官方php版本接口方法
  17. 其实,搭建一个有品质的棋牌游戏平台没那么复杂
  18. 学习笔记(07):C++网络编程进阶-IO模型之重叠Overlapped IO(基于事件通知)
  19. 前端ui框架layui——layer弹出层-弹出框方法
  20. idea支付宝扫一扫支付 史上最详细支付宝支付入门

热门文章

  1. 古人的养德养生观揭秘
  2. (一)Flume概述及快速入门
  3. CIKM 2022最佳论文:融合图注意力机制与预训练语言模型的常识库补全
  4. 串口通信是先发低位再发高位
  5. 计算机体系结构讲解,计算机体系结构 | x86 架构的讲解
  6. win7开机后svchost.exe占用内存的问题解决
  7. 全国计算机c++考试,2018年全国计算机二级C++考试考什么内容
  8. Python之图片转PDF
  9. 搜索与回溯:取石子游戏
  10. Excel作出线性回归图像