最近在学习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. Java如何格式化24小时格式的时间?

    在Java中,如何格式化24小时格式的时间?? 此示例使用SimpleDateFormat类的sdf.format(date)方法将时间格式化为24小时格式(00:00-24:00). package ...

  2. 使用Maven构建项目

    要构建一个基于Maven的项目,打开控制台,进入到 pom.xml 文件所放的项目文件夹,并发出以下命令: mvn package 这将执行Maven的“package”阶段. Maven构建生命周期 ...

  3. (转)YUV420、YUV422、RGB24转换

    //平面YUV422转平面RGB24static void YUV422p_to_RGB24(unsigned char *yuv422[3], unsigned char *rgb24, int w ...

  4. ie7/8浏览器报错:对象不支持“trim”属性或方法

    解决方法: 方法1: 使用jquery里面的全局函数$.trim()代替原生js方法trim(): $.trim( 你要替换的字符 ); 方法2: Function.prototype.method ...

  5. table中td的内容换行。

    table设置样式: table-layout: fixed; td设置: word-wrap: break-word;

  6. Mac下配置Oracle数据库客户端远程连接数据库服务器

    下载mac数据库客户端: 地址:http://www.oracle.com/technetwork/topics/intel-macsoft-096467.html 下载这俩个:(来源:http:// ...

  7. SSM框架快速整合实例——学生查询

    一.快速准备 SSM 框架即 Spring 框架.SpringMVC 框架.MyBatis 框架,关于这几个框架的基础和入门程序,我前面已经写过几篇文章作为基础和入门介绍了.这里再简单的介绍一下: 1 ...

  8. python对日志处理的封装

    一个适应性范围较广的日志处理 # coding=utf8 """ @author bfzs """ import os import log ...

  9. Android反编译工具介绍与简单实用方法

    Android反编译的目的无非就是为了看到APK的xml.资源和代码: 得到代码的方式:直接解压APK文件 --> 得到classes.dex文件 --> 使用 dex2jar class ...

  10. Spring-Mybatis --- 配置SqlSessionFactoryBean,整合Spring-Mybatis

    要利用Mybatis首先是需要导入mybatis-x.x.x.jar,其次,要整合Spring和Mybatis需要导入mybatis-spring-x.x.x.jar. JAR : mybatis-x ...