Lua和NodeJS

编程模型的思考
一年前,迷恋了NodeJS一段时间,因为换工作的原因一年多没有再关注。但是NodeJS这种单线程全异步的编程模型给了我很多启发,在大多数情况下可以极大的简化程序的编写并保持相对较高的性能。其实大多数的应用场景也都是遵循20-80原则的。即百分之20的流程花费了百分之80的时间,剩余百分之80的的流程只花费百分之20的时间。而花费时间比较多的流程又分为CPU密集型和IO密集型,对于CPU密集型的流程可以引入多线程的机制充分利用CPU,对于IO密集型可以使用异步IO来解决。而对于另外百分之80的流程仅在单线程环境中编写,这样可以极大简化代码的编写,因为没有了锁冲突,所以性能很有可能比多线程环境还有提高。可见,如果一个应用能够识别出其中最花费时间的流程,采用异步事件的机制放到别的线程或进程中处理,而其余大部分逻辑仅需在d单线程环境中实现,这样即可以保证性能有可以简化编程。

NodeJS

NodeJS正是这样的思想,JS的运行环境天然就是多路复用的单线程模型,将浏览器界面的DOM事件替换为服务端的连接事件,这样就可以使用JS高效的编写后台应用。如果用来编写网络服务,因为前后台使用的语言一至(都是JS),使用起来很是方便。虽然NodeJS给我很多启发,但是它还不是我理想中的编程工具。原因有二:1、NodeJS太重量,单是编译出的解释器就有好几M大小(主要是V8太庞大)。2、NodeJS比较成熟和复杂了,难以完全理解其全部的原理。3、JS语言本身有坏名声,不喜欢。这时候就想到了另一种语言Lua。

Lua
Lua语言很小巧,静态连接的包括标准库的lua解释器仅有187K大小(X86_64 after
strip),而且据说速度非常快。Lua在设计之初就用来嵌入C语言,有完善的接口和C交互,非常适合作为胶水语言。对于我这个C程序员来说Lua非常适合用来实现类似NodeJS的编程模型。最主要的是lua语言本身十分小巧和干净。

编程框架
因为几个程序需求的驱动,想从实践入手逐渐使用lua实现一个类似NodeJS的编程框架。和NodeJS的相同的地方是都为动静态语言结合的单线程事件模型。和NodeJS的不同的地方有很多:1、lua框架一定是非常小巧和高效的,适合嵌入式环境;2、本框架不准备向使用者屏蔽其C语言的本质,lua仅仅负责处理程序中策略的部分,而C语言负责机制的实现,使用本框架一般需要同时编写C和lua代码;3、本框架不是仅适合编写服务端程序,也可以编写图形界面程序,它不会要求用户将所有功能都链接到一起,而是在编译框架的时候根据需要编译自己需要的功能,这样保证程序的小巧和高效。
目前计划第一批加入框架的功能是FTPServer,upnp和图形界面(因为自己需要用)。计划支持跨平台,初期是linux,因为是开发环境,以后有精力时移植到其他平台。框架会放在github上开源,名字还没想好。做这个框架的目的一是为了给自己做一个好用的编程框架,给将来写程序提供便利,二是学习lua和编译原理(因为lua语言解释的代码量非常小,是个很好的材料)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Node-Lua是一款基于Lua实现的脚本和服务器引擎,它支持构建海量Lua服务(Context_Lua)并以多线程方式运行在多核服务器上,采用了任务多路复用的设计方案,有效利用了多核优势。node-lua致力于构建一个快速、简单易用的Lua脚本和服务器开发和运行环境。该引擎参考了Node-Js和Skynet的设计思想,并对其进行了整合和优化。 该引擎当前版本实现了以下特性: 引擎核心层同时支持同步阻塞和异步回调的api设计方案,让异步io等接口更加简单易用。调用同步和异步api时引擎核心层将会自动挂起正在执行的lua函数(coroutine),直接放弃占用的cpu资源; 服务创建以指定lua文件为入口脚本文件,脚本直接运行在新服务的coroutine环境中,支持在入口脚本当中直接调用同步和异步api接口,支持无限循环调用同步api接口;可以创建海量独立的lua服务(context_lua),引擎会根据当前运行服务总量和物理核心数量动态调整工作线程数量,当引擎没有需要处理的服务请求时(即任务队列为空),所有物理线程将会挂起等待,直到有新的任务(lua同步和异步回调)需要被唤醒运行;支持在用户创建的lua coroutine中直接调用引擎提供的同步和异步api接口,对用户态coroutine执行不会产生任何影响;引擎会检测进程当中有效的lua服务总量,当服务总量为0时,引擎会自动安全退出(可以用node-lua作为简单的lua脚本解释器使用)。同时,lua服务也会检测服务当中运行和挂起的同步和异步回调总量,当回调总量为0时,lua服务会被标记并安全退出;引擎框架任务调度采用了线程任务队列的设计,减少了不同线程之间对任务资源的竞争。另外,任务调度也引入了work-stealing算法对调度进行了深度优化;引擎提供了tcp socket相关的大部分api接口,同时支持unix_domain_socket;引擎提供了lua服务相关的api接口,包括服务创建、销毁、通信等同步和异步接口;引擎提供了定时相关的api接口,基本满足所有的定时设计,并直接被嵌入到了其它同步和异步api接口当中(tcp,服务相关的api等);引擎提供了快速lua字符串缓存结构,可以用于高效的广播接口当中;引擎当前提供了centos,macos,windows环境下的编译和安装;Node-Lua在下个版本将会提供以下新功能和特性: udp接口支持;tcp和udp socket在lua服务之间的迁移;在线服务热更新;在线服务调试;提供FreeBSD等环境下的编译和安装;提供基准测试版本;欢迎大家发现Node-Lua当中的bug,对Node-Lua提出更好的建议! 标签:NodeLua

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值