扭曲的inlineCallbacks和远程生成器

时间:2014-01-01 14:04:11

标签: python twisted perspective-broker

我在代码中使用了defer.inlineCallbacks,因为我觉得它比使用addCallbacks更容易阅读和调试。

我正在使用PB,我在将数据返回给客户端时遇到了问题。数据大小约为18Mb,由于返回字符串的长度,我得到BananaError失败。

我想要做的是编写一个生成器,这样我就可以继续调用函数并在每次调用函数时返回一些数据。

如何使用已经使用的inlineCallbacks来编写它?它实际上是否可能,如果我返回一个值。会有类似以下的工作吗?

@defer.inlineCallbacks
def getLatestVersions(self):
    returnlist = []
    try:
        latest_versions = yield self.cur.runQuery("""SELECT id, filename,path,attributes ,MAX(version) ,deleted ,snapshot , modified, size, hash, 
                           chunk_table, added, isDir, isSymlink, enchash from files group by filename, path""")
    except:
        logger.exception("problem querying latest versions")

    for result in latest_versions:
        returnlist.append(result)
        if len(return_list) >= 10:
            yield return_list
            returnlist = [] 
    yield returnlist

1 个答案:

答案 0 :(得分:6)

inlineCallbacks修饰的生成器函数返回Deferred - 而不是生成器。情况总是如此。您永远不能从装饰有inlineCallbacks的函数返回生成器。

请参阅twisted.spread.util中的寻呼机课程,了解您可以采取的另一种方法。