我想通过 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 号航站楼,我看到它很高兴地保持“乒乓”状态并且on_connection_close
永远不会被调用。
底线 - 仍然不起作用。