您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

在Tornado异步处理程序中使用简单的python生成器作为协同例程?

在Tornado异步处理程序中使用简单的python生成器作为协同例程?

这是您所描述内容的基本版本。为了避免阻塞,您可以通过回调函数生成器传递给IOLoop。这里的技巧是因为您没有使用执行实际IO的进程,因此没有os级别的进程/文件处理程序可通过来添加到IOLoop中add_handler,您可以使用简单的add_callback调用并从回调函数中反复调用它来保持IOLoop回调队列中的函数,直到生成器完成为止。

import tornado.httpserver
import tornado.ioloop
import tornado.web

class TextHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    def get(self):
        self.generator = self.generate_text(1000)
        tornado.ioloop.IOLoop.instance().add_callback(self.loop)

    def loop(self):
        try:
            text = self.generator.next()
            self.write(text)
            tornado.ioloop.IOLoop.instance().add_callback(self.loop)
        except StopIteration:
            self.finish()

    def generate_text(self, 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

application = tornado.web.Application([
    (r"/text/", TextHandler),
])

http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(8888)
tornado.ioloop.IOLoop.instance().start()
python 2022/1/1 18:45:50 有342人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶