Folks, Я полностью смущен, поэтому, возможно, я даже не задаю вопросы правильно, но здесь говорится:
У меня есть скрученное приложение, использующее inlineCallbacks. Теперь мне нужно определить итератор, который будет означать, что генератор возвращается вызывающему. Тем не менее, итератор не может быть inlineCallbacks украшены, не так ли? Если нет, то как я это делаю, я кодирую что-то вроде этого.
Просто чтобы уточнить: цель process_loop должна быть вызвана каждый, скажем, 5 секунд, он может обрабатывать только ОДИН кусок, скажем 10, а затем он должен отпустить. Однако, чтобы знать, что кусок 10 (хранится в кэше, который является dict dict), ему нужно вызвать функцию, которая возвращает отложенную.
@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'