2013-06-26 293 views
1

对此优秀页面发现以下功能:执行ping命令来使用Lua io.popen地址,非阻塞如果Ping超时

function os.capture(cmd, raw) 
    local f = assert(io.popen(cmd, 'r')) 
    local s = assert(f:read('*a')) 
    f:close() 
    if raw then return s end 
    s = string.gsub(s, '^%s+', '') 
    s = string.gsub(s, '%s+$', '') 
    s = string.gsub(s, '[\n\r]+', ' ') 
    return s 
end 

如果我用CMD =“平myknowngoodip执行此功能 - c 1“,那么一切都很好,它立即回来的结果。

但如果Ping超时(服务器上下左右),它阻断至少5秒钟整个节目对我来说

可能的解决方案:

  • 使用协同程序(但如何设计他们妥善得到它的工作?)

  • 使用的东西来检测,如果该文件被写入或写锁就可以了(我怎么做吗?)

目标是我通过copas接收(http://keplerproject.github.io/copas/)“查找”请求来ping不同的IP并在IP存活或不存在时报告回来。 COPAS启动并运行,至今工作

你的帮助

+0

单独的线程与专用的Lua VM在里面? –

回答

1

io.popen非常感谢是不会有COPAS工作。 Copas是用于插座,而不是管道。

最快的解决方案是使用轮询;例如:

local socket = require "socket" 
local waitTime, sleepTime = 5, 0.1 
local endT = os.time() + waitTime 
local result 
os.capture("ping myknowngoodip -c 1 > myoutfile") 
while os.time() <= endT do 
    local pcall_ok, fHand = pcall(io.open, "myoutfile", "r") 
    if pcall_ok then 
     result = assert(fHand:read("*all")) 
     assert(fHand:close()) 
    end 
    socket.sleep(sleepTime) 
end 
if result then 
    -- Success! 
else 
    -- Error :(
end 

另一种可能性是一个单独的线程; LuaLanes是那里最好的多线程工具包,但在内存消耗方面也是最大的。然而,这涉及更多一些。

另一种选择是使用Copas或LOOP's SocketScheduler(建议,它比Copas好得多)实现自己的ping套接字;这将是异步开始。 LOOP.SocketScheduler也是一个很好的协程管理框架,可用于各种各样的事情,并可用于上面采样的代码(用scheduler替换socket.sleep:sleep,并在新创建和注册的协程中运行代码)。

如果你是一名称职的C程序员,你也可以让C做这项工作;例如调用C函数,将其传递给Lua回调函数,并在完成ping操作后从新创建的pthread中调用回调函数。

声明:代码未经测试。