回调还是消息队列
这篇文章从作者封装Hive socket库时遇到的一个具体问题切入:如何处理底层`poll` API产生的事件。直接注入回调函数虽然直接,但容易引发异常、重入等不可控问题,且会加剧C/Lua边界的性能负担。 作者提出的方案是将事件及数据一次性返回给Lua层处理。为优化此方案可能带来的GC压力,他采用了一个预先传入的消息队列(一个空的Lua table)作为接收结构。在C层,通过高效的`rawseti`操作将消息逐条写入这个结构,并巧妙地利用一个缓存池来复用存储每条消息参数的小table,从而在系统稳定后避免了临时构建大型Lua表。 文章最后,作者还附上了一段极简的Lua消息队列实现代码,展示了其优雅的实现思路。整体而言,文章分享了一个从具体问题出发,在性能与可控性间权衡并最终优化实现的技术决策过程。