繁体   English   中英

了解tornado.web.RequestHandler.flush

[英]Understanding tornado.web.RequestHandler.flush

服务器:

from tornado import ioloop, web, gen

class MainHandler(web.RequestHandler):
    @gen.coroutine
    def get(self):
        self.write('1' * 1024)
        self.flush(callback=(yield gen.Callback('flush')))
        yield gen.Wait('flush')
        print 'First chunk sent'

        self.write('2' * 1024)
        self.flush(callback=(yield gen.Callback('flush')))
        yield gen.Wait('flush')
        print 'Second chunk sent'
        self.finish()

application = web.Application([
    (r"/", MainHandler),
])

if __name__ == "__main__":
    application.listen(8000)
    ioloop.IOLoop.instance().start()

和客户:

import urllib2
urllib2.urlopen('http://127.0.0.1:8000/').close()

请求后,我将在服务器控制台中看到以下内容:

First chunk sent
Second chunk sent

但我希望那里什么也看不到。 我不明白什么

您希望阻塞flush(),直到客户端读取了该字节数为止?

flush()仅确保您已将字节写入操作系统的网络输出缓冲区。 该缓冲区可能比3k大得多。 在我的Linux机器上,大约需要200k:

$ cat /proc/sys/net/core/wmem_default
212992

在客户端阅读您的消息之前,您无法进行任何阻止。 如果您需要等到客户端收到消息,则客户端应该发送确认消息,并且您应该收听。

问题出在urllib2。 它可以与下一个基于套接字的客户端配合使用:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 8000))
s.send("GET / HTTP/1.0\r\n\r\n")
s.close()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM