如何使Lua函数一直阻塞,直到调用闭包函数。

我有一个自定义的 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
点赞
用户1442917
用户1442917

如果你想要使用协程,以下方式可能适合你(或者给你一些尝试的思路):

-- 这应该是 socket 属性,但是对于这个示例来说足够了
local connected
local function onConnect(cookie, err, sock)
  print("已连接!")
  connected = true
end

local function connect(host, port)
  connected = false
  local success, err = socketConnect(host, port, onConnect)
  while not connected do
    coroutine.yield()
  end
  print("正在连接中...")
end

现在,你可以从 connect 函数中创建一个协程,然后使用 coroutine.resume 持续调用该协程,直到它完成(该协程的 coroutine.status 将返回 'dead'),你将得到所需的结果。显然,你可以将 while 循环移动到 socketConnect 函数本身,这将使它从用户的角度变为同步,因为它在执行 onConnect 之前不会返回任何结果。

2014-10-22 19:15:48