Скрученный Python: итераторы и результаты / inlineCallbacks

Ребята, Я полностью запутался, так что, возможно, я даже не спрашиваю правильно, но вот что:

У меня есть скрученное приложение, использующее inlineCallbacks. Теперь мне нужно определить итератор, который будет означать, что генератор возвращается вызывающей стороне. Однако итератор не может быть оформлен inlineCallbacks, не так ли? Если нет, то как мне написать что-то вроде этого.

Чтобы уточнить: цель - process_loop нужно вызывать каждые, скажем, 5 секунд, он может обработать только ОДИН фрагмент, скажем, 10, а затем он должен отпустить. Однако, чтобы узнать, что этот кусок из 10 (хранящийся в кэше, что является диктатом словаря), ему необходимо вызвать функцию, которая возвращает deferred.

@inlineCallbacks ### can\'t have inlineCallbacks here, right?
def cacheiter(cached):
    for cachename,cachevalue in cached.items():
        result = yield (call func here which returns deferred)
        if result is True:
            for k,v in cachedvalue.items():
                yield cachename, k, v

@inlineCallbacks
def process_chunk(myiter, num):
    try:
        for i in xrange(num):
            nextval = myiter.next()
            yield some_processing(nextval)
        returnValue(False)
    except StopIteration:
        returnValue(True)

@inlineCallbacks
def process_loop(cached):
    myiter = cacheiter(cached)
    result = yield process_chunk(myiter, 10)
    if not result:
        print 'More left'
        reactor.callLater(5, process_loop, cached)
    else:
        print 'All done'
18
задан helpmelearn 12 May 2011 в 02:20
поделиться