最近在学习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的更多相关文章

  1. Arduino Core For ESP8266

    如果选择纯C作为ESP8266的开发,有两个途径: 使用乐鑫官方原生的 RTOS-SDK或者NONOS-SDK 使用Arduino IDE 使用PlatformIO 作为一个"Arduino ...

随机推荐

  1. [转]jQuery选择器 (详解)

    1).基本 #id 根据给定的ID匹配一个元素.例如:$("#id")element 根据给定的元素名匹配所有元素.例如:$("div").class 根据给定 ...

  2. e796. 设置JSlider的方向

    Besides being either horizontal or vertical, a slider can also be inverted. An inverted horizontal s ...

  3. Radix-64编码简介

    本文介绍Radix-64编码,PGP和S/MIME均使用了Radix-64编码技术,rfc4880的Chap 6有关于Radix-64的详细描述. Radix-64编码基于Base64编码技术,由两部 ...

  4. Build opencv libraries for android arm, x86 ubuntu

    废话不多说. 准备工作: 1. 下载源代码: http://opencv.org/ 编译平台:ubuntu14.04 opencv 2.4.6.1 本人用这样的办法编译了opecv 2.4.9 的没有 ...

  5. 有空研究一下 superwebsocket (底层是 supersocket) 用来实现 web聊天什么的

    参考:http://superwebsocket.codeplex.com/ 一个老外写的 asp.net 下socket的多钟方案推荐 :http://www.codeproject.com/Art ...

  6. Cisco配置单臂路由及静态路由

    实验环境: 如图下图所示,PC0.PC1.PC2.PC3分别属于不同的VLAN,通过配置单臂路由及静态路由,实现不同VLAN之间的PC能相互访问. 操作步骤: 1. 思科 2960交换机SW1配置信息 ...

  7. jsTree 插件

    html代码 <div id="jstree1"></div> js代码: <script src="__STATIC__/h5/js/jq ...

  8. Oracle高级查询之CONNECT BY

    为了方便大家学习和测试,所有的例子都是在Oracle自带用户Scott下建立的. Oracle中的select语句可以用start with ... connect by prior ...子句实现递 ...

  9. 不确定行数的多行文本垂直水平居中的css

    ul li { position:relative; display: table; width:3rem; height:3rem; background:url('image/defaultBg. ...

  10. 1. 自动化运维系列之Cobbler自动装机

    preface 我们之前批量安装操作系统的时候都是采用pxe来安装,pxe也是通过网络安装操作系统的,但是PXE依赖于DHCP,HTTP/TFTP,kicstart等支持.安装流程如下所示: 对于上面 ...