释放关闭(Releasing closures)

2019-09-26 13:28发布

在一个nodemcu,我使用了闭包来发送文件通过套接字,就像这样:

function sendfile(sock, name)
    local fd = file.open(name, "r")

    function sendchunk()
        local data = fd:read()
        if data then
            sock:send(data)
        else
            fd:close()
            sock:close()
        end
    end

    sock:on("sent", sendchunk)
    sendchunk()
end

几个文件,解释恐慌转移由于“没有足够的内存”之后。 我能想象这可能是由于封闭还在闲逛。 这将是困难的垃圾收集器,以确定sendchunk()将不会被再次调用一次文件和插座被关闭。

不幸的是我的谷歌搜索没有透露结束关闭和释放它使用的内存的方法。

我使用了错误的方法来做到这一点? 我也许应该使用匿名函数或东西吗?

Answer 1:

已经提到这里的是:on()调用都保存参照回调的Lua注册表内关闭。
我想这将封从Lua注册表中清除__gc的元方法sock对象,
sock ,如果关闭引用对象将不会被收集sock对象。
为了解决这个问题,你应该避免硬编码参考, sock在体内的upvalue sendchunk()函数。
例如,利用的事实,传递给回调函数的第一个参数始终是Socket对象。

function sendfile(sock, name)
   local fd = file.open(name, "r")

   local function sendchunk(sck)
      local data = fd:read()
      if data then
         sck:send(data)
      else
         fd:close()
         sck:close()
      end
   end

   sock:on("sent", sendchunk)
   sendchunk(sock)
end


文章来源: Releasing closures