我想通过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中捕获写错误?在
更新:答案中的以下建议我尝试了以下方法:
^{pr2}$我在终端1和终端2中运行这个文件,我调用:
curl -s http://localhost:8888/ping
在第一次响应之后,我点击了CTRL-C,但是在终端1中,我看到它很高兴地保持“pong”—ing,并且on_connection_close
永远不会被调用。在
底线-仍然不起作用。在
实现on_connection_close方法,并让它停止
get
处理程序中的写循环。在您需要使处理程序异步并使用
ioloop.add_timeout
而不是time.sleep
,因为这会阻止循环:相关问题 更多 >
编程相关推荐