元表错误

我正在为 torch 中的线程设置一个玩具示例,但在运行下面的代码时出现了错误。我想这可能只是我设置表格的方式不对,但我不确定。

Threads = require 'threads'
Threads.serialization('threads.sharedserialize')

DataThreads = {}
DataThreads.__index = DataThreads
local result = {}
local unpack = unpack and unpack or table.unpack

function DataThreads.new(nThreads,opt_)
        local self = {}
        opt_ = opt_ or {}
        self.threads = Threads(nThreads,
                           function()
                                   print("background stuff")
                           end
                        )
        self.threads:synchronize()

        -- 下面的 for 循环引起了错误,但是后面相同的 :addjob() 可以正常工作
        for i=1, nThreads do
                self.threads:addjob(self._getFromThreads, self._pushResult)
        end
        return setmetatable(self,DataThreads)
end

function DataThreads._getFromThreads()
              x,y = torch.uniform(),torch.uniform()
              return x,y
end

function DataThreads._pushResult(...)
        local res = {...}
        if res == nil then
                self.threads:synchronize()
        end
        result[1] = res
end

function DataThreads:getBatch()
        self.threads:addjob(self._getFromThreads, self._pushResult)
        self.threads:dojob()
        local res = result[1]
                result[1] = nil
        if torch.type(res) == 'table' then
                return unpack(res)
        end
                print(type(res))
        return res
end

d = DataThreads.new(4)

错误出现在 .new 函数的 :addjob() 中。然而,后来在 :getBatch() 函数中调用相同的 :addjob() 可以工作。我不能在设置元表之前调用 _getFromThreads()_getFromThreads() 函数吗?以下是错误,我认为意味着 _getFromThreads() 没有返回任何东西;

/home/msmith/torch/install/bin/luajit: ...e/msmith/torch/install/share/lua/5.1/threads/threads.lua:215: function callback expected
stack traceback:
    [C]: in function 'assert'
    ...e/msmith/torch/install/share/lua/5.1/threads/threads.lua:215: in function 'addjob'
    threads.lua:21: in function 'new'
    threads.lua:54: in main chunk
点赞
用户258523
用户258523

当你的 new 函数运行时,元表尚未设置,所以当你使用 self._getFromThreadsself._pushResult 时,什么也没有,你会得到 nil,这是无效的。

new 函数返回之后,它工作了,因为此时已经添加了元表,所以查找使用 __index 元方法来查找条目。

你可以这样做:

local self = setmetatable({}, DataThreads)

立即设置元表,然后只需

return self

在结尾处。

2016-03-15 20:23:24