Twisted inlineCallbacks и удаленные генераторы

Я использовал defer.inlineCallbacks в своем коде, так как считаю, что его намного легче читать и отлаживать, чем использовать addCallbacks.

Я использую PB, и у меня возникла проблема при возврате данных клиенту. Размер данных составляет около 18 МБ, и я получаю ошибку 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

person Deano123    schedule 01.01.2014    source источник


Ответы (1)


Функция генератора, украшенная inlineCallbacks, возвращает Deferred - не генератор. Так всегда бывает. Вы никогда не сможете вернуть генератор из функции, украшенной inlineCallbacks.

См. Классы pager в twisted.spread.util, чтобы узнать о другом подходе, который вы можете использовать.

person Jean-Paul Calderone    schedule 01.01.2014
comment
Я так и думал. Спасибо за подсказку по классу пейджера, я посмотрю и посмотрю, что смогу найти. Большое спасибо за Вашу помощь. - person Deano123; 01.01.2014