首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >了解tornado.web.RequestHandler.flush

了解tornado.web.RequestHandler.flush
EN

Stack Overflow用户
提问于 2014-02-11 23:15:50
回答 2查看 1.4K关注 0票数 0

服务器:

代码语言:javascript
复制
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()

和客户端:

代码语言:javascript
复制
import urllib2
urllib2.urlopen('http://127.0.0.1:8000/').close()

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

代码语言:javascript
复制
First chunk sent
Second chunk sent

但我希望在那里什么也看不到。我有什么不明白的?

EN

回答 2

Stack Overflow用户

发布于 2014-02-12 03:31:49

您希望在客户端读取该字节数之前阻塞flush()吗?

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

代码语言:javascript
复制
$ cat /proc/sys/net/core/wmem_default
212992

在客户端读完你的消息之前,没有办法阻止你。如果您需要等待客户端收到消息,则客户端应发送确认消息,您应侦听该消息。

票数 1
EN

Stack Overflow用户

发布于 2014-02-12 03:18:45

问题出在urllib2上。它完美地与next socket-baset客户端配合使用:

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21705739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档