背景

因为原始的lua代码不支持多线程,多数用的都是协程。这样对于多任务的,需要定时刷新状态的应用就不太理想。
为什么不支持尼?
因为lua状态机的维护是一个全局变量,这样多线程会导致维护成本高。
lanes?
lanes是一个支持lua多线程的开源库,通过维护不同的lua状态机实现多线程。线程间通信使用linda对象。

编译准备

1. 下载源码

github地址

2. 安装MinGW,Cmake

  1. 这里安装不是大问题,安装好后记得将bin目录添加到环境变量中去。
  2. MinGW中需要添加msys的安装。

3. 安装lua for windows

有几点需要注意:

  1. 安装lua的版本需要是5.1版本
  2. 查看Makefile文件我们看到有去查找lua51和lua5.1的路径,所以安装好后需要将lua的路径添加到环境变量中去。

代码测试

lanes的接口实现实际上是脚本调用动态lanes库后进一步封装实现的。都放在lanes.lua脚本中。
编译好后,在src目录下建立一个lanes_task.lua的文件,将下面代码copy到文件中去,cmd运行 lua lanes_task.lua,这里我尝试过将编译好的动态库一出来,但是运行的时候老是加载失败,暂时没有找到原因。

local lanes = require "lanes"
lanes.configure{with_timers=false}  --with_timers置为false之后才能运行sleep

local linda = lanes.linda()  --可以看成是一个消息队列
local function loop( max)
    for i = 1, max do
        print( "sending: " .. i)
        linda:send( "y", i)    -- linda as upvalue 发送消息
        lanes.sleep(1)
    end
end

a = lanes.gen( "*", loop)( 10)   --建立task


while true do
    local key, val = linda:receive( 4.0, "y")    -- timeout in seconds 接收消息
    if val == nil then
        print( "timed out",lanes.now_secs())
        break
    end
    print( tostring( linda) .. " received: " .. val)
end

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐