【发布时间】:2014-12-18 05:30:57
【问题描述】:
我有一个自定义的 Lua 解释器可执行文件,内置了一些基本的套接字功能。它不是 Luasocket,尽管我想在这里使用 Luasocket,但我不能(所以请不要将其作为答案)。
我正在使用的套接字 API 依赖于异步闭包来发出网络操作已完成的信号。因此,在下面的代码中,socketConnect() 立即返回,然后在连接完成后调用 onConnect()。
local function onConnect(cookie, err, sock)
print("Connected!")
end
local function connect(host, port)
local success, err = socketConnect(host, port, onConnect)
print("Connecting...")
end
那么,问题来了。我想制作 connect() 功能块,直到调用 onConnect() 闭包。我是 Lua 的新手,但我希望协程在这里可能会有所帮助?
编辑:这是我使用协程制作功能块的尝试:
local connected = false
local function onConnect(cookie, err, sock)
print("Connected!")
connected = true
end
local coroConnect = coroutine.create(
function()
local success, err = socketConnect(m_sHost, m_nPort, onConnect);
while not connected do
coroutine.yield()
end
end
)
local function connect(sHost, nPort)
m_sHost = sHost
m_nPort = nPort
while not coroutine.status(coroConnect) ~= "dead" do
coroutine.resume(coroConnect)
print("Connecting...")
end
end
【问题讨论】:
-
Lua 不支持多线程或异步回调,因此
socketConnect在回调返回之前调用回调,或者代码使用一些多线程扩展,在这种情况下,知道哪一个会很有帮助。 -
我的 custom Lua 解释器确实有一个工作线程,从中调用回调。如果我调用上面的 connect(),打印输出将是“Connecting...Connected!”