我在写 comet 的时候发现 tornado 异步处理的时候 flush() 不起作用,也就是无论什么时候向浏览器发送信息永远都是等连接结束的时候才会收到。我找了很久都没有看到有人碰到类似的问题。今天突然想起来可能是前端 nginx 造成的,如果是 PHP ,分 ob_flush() 和 flush() 之分,前者是 PHP 的缓存输出,后者是 apache/nginx 的缓存输出,但我没有发现 Tornado 有任何的方法可以强制 nginx 输出缓存中的内容。后来我在 stackoverflow 上找到一个解决方法:
1 |
self.add_header("X-Accel-Buffering", "no") |
这条 header 的意思是告诉 nginx 在本次请求中关闭缓存。使用以后 flush() 立刻正常运作。