我在代码中使用了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
答案 0 :(得分:6)
用inlineCallbacks
修饰的生成器函数返回Deferred
- 而不是生成器。情况总是如此。您永远不能从装饰有inlineCallbacks
的函数返回生成器。
请参阅twisted.spread.util
中的寻呼机课程,了解您可以采取的另一种方法。