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 ...
随机推荐
- SpringMVC系列(六)处理模型数据
Spring MVC 提供了以下几种途径输出模型数据: ModelAndView: 处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添加模型数据 Map 及 Model: ...
- Java如何获得运行线程的优先级?
在Java编程中,如何获得运行线程的优先级? 以下示例使用setPriority()方法打印正在运行的线程的优先级. package com.yiibai; public class GettingT ...
- Spring JDBC SqlUpdate类示例
org.springframework.jdbc.object.SqlUpdate类提供了表示SQL更新的可重用操作对象. 使用到的 Student 表的结构如下 - CREATE TABLE Stu ...
- e798. 显示JSlider的标记标签
This example demonstrates how to display labels (numerical values) at the major ticks (see e797 显示JS ...
- C++编程经验-返回局部变量的讨论(转)
返回局部变量没问题 如果返回局部变量有问题,函数的意义还有吗? 全局变量还用返回吗? 返回指向局部变量的指针才有问题, 函数退栈之后,局部变量消失, 指针将指向未知区域,所以出现问题. 返回局部 ...
- 一款CSS3仿Google Play的垂直菜单
之前分享过一款非常酷的CSS3垂直下拉动画菜单,是多级菜单.今天我们来看一款也是用CSS3制作的垂直菜单,是仿Google Play的菜单,菜单项都带有可爱的小图标,可以先来看看效果图: 当然你可以在 ...
- linux中安装typecho的pathinfo配置
最近,我安装typecho,安装完之后发现,只有首页能够访问,其他的页面报404错误 后来发现时nginx默认情况下不支持pathinfo模式,于是我查找一下资料.终于得到解决. 我的nginx.co ...
- Umbraco中使用Related Links显示内部链接和外部链接
在Umbraco的论坛里看到的办法,演示了如何在Umbraco中使用Related Links并显示的过程. 原文地址:http://www.nibble.be/?p=48
- 清除 Xcode 项目缓存
运行错误.编译错误.发布错误可尝试清除 Xcode 缓存:清除 Xcode 缓存也能减少占用磁盘空间. (1)前往文件夹(control+shift+G),删除里面的文件: /Users/用户名/Li ...
- 解决parseSdkContent failed java.lang.NullPointerException错误
今天我的eclipse崩溃了,报“parseSdkContent failed java.lang.NullPointerException”的错误. 所有的安卓项目都不正常,创建项目就会报 java ...