【发布时间】:2013-10-30 08:58:54
【问题描述】:
我想通过 Tornado 流式传输一个长的数据库结果集。 我显然需要一个服务器游标,因为将整个查询加载到内存中是不可行的。
所以我有以下代码:
class QueryStreamer(RequestHandler):
def get(self):
cursor.execute("Select * from ...")
chunk = cursor.fetch(1000)
while chunk:
self.write(chunk)
self.flush()
chunk = cursor.fetch(1000)
self.finish()
cursor.close()
如果有人直到最后都没有阅读我的请求? (即curl ... |head),
get 方法可以愉快地将我的数据流式传输到任何地方。我希望在某个时候得到SIGPIPE 并关闭数据库游标(而不是将它运行到最后)。
如何在 Tornado 中捕获写入错误?
更新:按照答案中的建议,我尝试了以下方法:
import tornado.ioloop
import tornado.web
import time
class PingHandler(tornado.web.RequestHandler):
def get(self):
for i in range(600):
self.write("pong\n")
self.flush()
time.sleep(1)
print "pong"
self.finish()
print "ponged"
def on_connection_close(self):
print "closed"
if __name__ == "__main__":
application = tornado.web.Application([ ("/ping", PingHandler), ])
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()
我在终端 1 中运行此文件,并在终端 2 中调用:
curl -s http://localhost:8888/ping
在第一次响应后,我按下了 CTRL-C。但是在 1 号航站楼,我看到它很高兴地保持“pong”-ing 并且 on_connection_close 永远不会被调用。
底线 - 仍然不起作用。
【问题讨论】: