tornado 的 flush 方法有啥用啊?

2016-03-07 17:29:29 +08:00
 eightqueen
from tornado.ioloop import IOLoop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")
        self.flush()

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(1234)
    IOLoop.current().start()

很简单的一个 hello world 程序,我把 flush 去掉,照样运行正常。

2517 次点击
所在节点    Python
5 条回复
yangtukun1412
2016-03-07 17:39:21 +08:00
在同步场景下会自动调用 self.finish(),你可以试试加上 tornado.web.asynchronous 装饰器,再去掉 self.flush() 运行
calease
2016-03-08 12:21:26 +08:00
用不用 async 都不用 flush
如果返回大文件要经常 flush
不然客户端得等到你所有数据都写入完毕了才能开始下载
eightqueen
2016-03-08 15:53:52 +08:00
@calease 还是不明白为什么不用 flush ?不 flush ,数据仍然在缓冲区,客户端怎么可能收到?
calease
2016-03-09 00:37:31 +08:00
@eightqueen
handler 运行结束时 tornado 会自动帮你 finish ,如果你没有手动 finish 过。 finish 的时候会调用 flush 把所有写的内容提交。
我第一句只是说 async 和 flush 没有关联,不是 async 了就一定要手动 flush 。
eightqueen
2016-03-09 16:05:24 +08:00
@calease 谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/261733

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX