博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nodelua
阅读量:5888 次
发布时间:2019-06-19

本文共 1402 字,大约阅读时间需要 4 分钟。

最近在学习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    endendfunction 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    endendfunction main()            --local l,err = tcp_listen("127.0.0.1",8010)--arg[1],arg[2])    local l,err = tcp_listen(arg[1],arg[2])    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!")endmain()

目前nodelua只实现了对tcp的支持,还不完善,后续会慢慢完善.

 

 

 

转载于:https://www.cnblogs.com/sniperHW/p/3511182.html

你可能感兴趣的文章
Linux0.00 “boot.s” 程序详解
查看>>
闭包与node.js
查看>>
Android横竖屏切换View设置不同尺寸或等比例缩放的XML解决方案
查看>>
db2look+db2move工具简介及其应用
查看>>
.NET开发者必备的免费工具
查看>>
淘宝HSF服务的原理以及简单的实现
查看>>
参加编程培训(Python、Java)面授到底值不值?
查看>>
树莓派SSH命令行连接wifi
查看>>
sed
查看>>
c#拦截程序的运行
查看>>
[转载] 百科全说——潘怀宗:“认识”食品添加剂(10-10-19)
查看>>
第一行代码
查看>>
IntelliJ IDEA快捷键大全
查看>>
[转载] 高级人工智能——第1章 绪论
查看>>
windows 2003的基本培配置
查看>>
我的友情链接
查看>>
DATAGUARD搭建脚本.
查看>>
[转载] 七龙珠第一部——第126话 复活的神龙
查看>>
第五阶段计划
查看>>
SDN in Action: Practice SDN/OpenFlow with LINC-Switch and OpenDaylight
查看>>