У меня есть функция генератора python, которая генерирует фрагменты текста. Я хотел бы написать метод get
для подкласса tornado.web.RequestHandler
, который будет выполнять итерацию по генератору, записывая фрагменты в ответ по мере его поступления.
Поскольку это Tornado, и поскольку генератор может занять секунду для обработки, я подумал, что было бы неплохо сделать обработчик асинхронным, используя этот генератор как сопрограмму и передавая управление IOLoop после каждого фрагмента. . Однако я не могу понять, как это сделать.
Вот мой пример (блокирующего) кода:
class TextHandler(web.RequestHandler):
@web.asynchronous
def get(self, n):
generator = self.generate_text(100000)
# Clearly, this will block. How to make it asynchronous?
for text in generator:
self.write(text)
def generate_text(n):
for x in xrange(n):
if not x % 15:
yield "FizzBuzz\n"
elif not x % 5:
yield "Buzz\n"
elif not x % 3:
yield "Fizz\n"
else:
yield "%s\n" % x
Как я могу заставить этот обработчик работать асинхронно?