5

我在我的代码中使用了 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
4

1 回答 1

6

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

有关您可以采用的另一种方法的想法,请参阅中的寻呼机类。twisted.spread.util

于 2014-01-01T16:29:11.517 回答