nodelua
最近在学习go,对go中网络处理的方式比较喜欢,就用lua coroutine + C 模仿着接口实现一个玩具玩玩.
主要框架是lua导入C模块的时候会启动一个网络线程,lua和网络之间通过两个消息队列交互,lua将网络请求通过消息队列发送到C,
C将应答和网络事件通过消息队列发送到lua.
lua主线程运行在一个coroutine调度循环上,并不断的尝试从队列获得消息,一但收到消息就唤醒等待在此消息上阻塞的lua coroutine.
跟go的区别是,go routine是可以在多个处理器核心上运行的.
我在设计的时候也考虑过,是否将spwan函数也实现成多线程的,程序启动的时候开N个线程创建N个虚拟机跑coroutine调度器,spwan的
时候将这个创建请求分发到负载最轻的coroutine调度线程上 。但lua虚拟机之间传递数据并不是这么方便,实现起来也不是那么clean,所以
暂时放弃了这个念头.
下面贴一段nodelua的tcp echo服务示例:
require("nodelua")
dofile("node/scheduler.lua")
function doio(s)
    print("doio")
    while true do
        local data,err = s:recv()
        if err == "disconnected" then
            print("a socket disconnect")
            return
        else
            s:send(data)
        end
    end
end
function listen_fun(l)
    print("listen_fun")
    while true do
        local s,err = l:accept()
        if s then
            node_spwan(s,doio) --spwan a light process to do io
        elseif err == "stop" then
            return
        end
    end
end
function main()
    --local l,err = tcp_listen("127.0.0.1",8010)--arg[1],arg[2])
    local l,err = tcp_listen(arg[],arg[])
    if err then
        print("listen error")
        return
    end
    print("listen ok")
    if l then
        node_spwan(l,listen_fun) --spwan a light process to do accept
    end
    node_loop()
    print("see you!")
end
main()
目前nodelua只实现了对tcp的支持,还不完善,后续会慢慢完善.
https://github.com/sniperHW/nodelua
nodelua的更多相关文章
- Arduino Core For ESP8266
		如果选择纯C作为ESP8266的开发,有两个途径: 使用乐鑫官方原生的 RTOS-SDK或者NONOS-SDK 使用Arduino IDE 使用PlatformIO 作为一个"Arduino ... 
随机推荐
- [转]jQuery选择器 (详解)
			1).基本 #id 根据给定的ID匹配一个元素.例如:$("#id")element 根据给定的元素名匹配所有元素.例如:$("div").class 根据给定 ... 
- e796. 设置JSlider的方向
			Besides being either horizontal or vertical, a slider can also be inverted. An inverted horizontal s ... 
- Radix-64编码简介
			本文介绍Radix-64编码,PGP和S/MIME均使用了Radix-64编码技术,rfc4880的Chap 6有关于Radix-64的详细描述. Radix-64编码基于Base64编码技术,由两部 ... 
- Build opencv libraries for android arm, x86 ubuntu
			废话不多说. 准备工作: 1. 下载源代码: http://opencv.org/ 编译平台:ubuntu14.04 opencv 2.4.6.1 本人用这样的办法编译了opecv 2.4.9 的没有 ... 
- 有空研究一下 superwebsocket (底层是 supersocket) 用来实现 web聊天什么的
			参考:http://superwebsocket.codeplex.com/ 一个老外写的 asp.net 下socket的多钟方案推荐 :http://www.codeproject.com/Art ... 
- Cisco配置单臂路由及静态路由
			实验环境: 如图下图所示,PC0.PC1.PC2.PC3分别属于不同的VLAN,通过配置单臂路由及静态路由,实现不同VLAN之间的PC能相互访问. 操作步骤: 1. 思科 2960交换机SW1配置信息 ... 
- jsTree 插件
			html代码 <div id="jstree1"></div> js代码: <script src="__STATIC__/h5/js/jq ... 
- Oracle高级查询之CONNECT BY
			为了方便大家学习和测试,所有的例子都是在Oracle自带用户Scott下建立的. Oracle中的select语句可以用start with ... connect by prior ...子句实现递 ... 
- 不确定行数的多行文本垂直水平居中的css
			ul li { position:relative; display: table; width:3rem; height:3rem; background:url('image/defaultBg. ... 
- 1. 自动化运维系列之Cobbler自动装机
			preface 我们之前批量安装操作系统的时候都是采用pxe来安装,pxe也是通过网络安装操作系统的,但是PXE依赖于DHCP,HTTP/TFTP,kicstart等支持.安装流程如下所示: 对于上面 ... 
