Lua - 使用定时器接收Socket并处理其他事件
2015-9-13 9:18:55
收藏:0
阅读:89
评论:2
我正在尝试使用服务器套接字实现一个脚本,它也会定期轮询多个传感器的数据(例如每分钟的第59秒)。我不想将数据序列化到磁盘中,而是将其保存在一个表中,这个套接字将在轮询时回复这个表。
这是一个简要的代码示例,以说明我正在做什么(我没有包括访问此服务器的客户端代码,但该部分是正常的)
我担心服务器可能会偶尔阻塞,因此我会错过第59秒。
这是实现这个过程的好方法,还是有(更简单)更好的方法来实现这个过程(例如使用协程)?如果协程更好,那么如何为我的情况实现它们?
点赞
用户282536
为了实现这个,你需要一些形式的多任务处理。我会使用网络感知调度程序,例如 cqueues。
代码如下:
local cqueues = require "cqueues"
local cs = require "cqueues.socket"
local data = {}
local count = 1
local function pollSensors()
-- 在这里进行传感器轮询并添加到表中,例如 os.time()
table.insert(data, os.time() .."\t" .. tostring(count))
count = count + 1
end
local function handle_client(client)
client:setmode("b", "bn") -- 打开 socket 的二进制模式,关闭缓冲
-- 从问题中移植的代码:
client:settimeout(2) -- 我不确定为什么你选择了 2 秒的超时时间
local line, err = client:read("*l") -- 使用 cqueues,此读取将不会阻塞整个程序,而只是在数据到达时产生当前协程的切换。
-- 处理接收到的行以确定响应
-- 为举例说明,我将发送表中的项目数量
if not err then
assert(client:write(string.format("Records: %d\n", #data)))
end
client:close()
end
local cq = cqueues.new() -- 创建一个新的调度程序
-- 创建第一个协程,等待传入的客户机
cq:wrap(function()
local server = cs.listen{host = "0.0.0.0"; port = "0"}
local fam, ip, port = server:localname()
print(string.format("Now listening on ip=%s port=%d", ip, port))
for client in server:clients() do -- 遍历接受的客户机
-- 为每个客户机创建一个新的协程,将客户机传递进去
cqueues.running():wrap(handle_client, client)
end
end)
-- 创建第二个协程,读取传感器
cq:wrap(function()
while true do
-- 我假设你只想每 60 秒读取一次,而不是实际上在每一分钟的第 59 秒进行读取。
pollSensors()
cqueues.sleep(60)
end
end)
-- 运行调度程序,直到所有线程退出
assert(cq:loop())
2015-09-14 01:23:22
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
我认为周期性地启动一些应用程序/代码很好地实现了各种语言中的“cron”库。
例如,在 Lua 中,您可以在此处下载 cron 库。