Использование простого генератора Python в качестве сопрограммы в асинхронном обработчике Tornado?

У меня есть функция генератора 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

Как я могу заставить этот обработчик работать асинхронно?

16
задан David Eyk 11 January 2012 в 00:45
поделиться