[英]tornado: How to create file-like object that writes to a RequestHandler?
在我的應用程序中,我正在嘗試創建一個將大文件流式傳輸到客戶端的處理程序。 這些文件由另一個模塊創建(確切地說是tarfile
)。
我想要的是一個類文件對象,它不是寫入磁盤上的套接字或實際文件,而是代理RequestHandler.write
方法。
這是我目前的天真實現:
import tornado.gen
import tornado.ioloop
import tornado.web
class HandlerFileObject(object):
def __init__(self, handler):
self.handler = handler
@tornado.gen.coroutine
def write(self, data):
self.handler.write(data)
yield self.handler.flush()
def close(self):
self.handler.finish()
class DownloadHandler(tornado.web.RequestHandler):
def get(self):
self.set_status(200)
self.set_header("Content-Type", "application/octet-stream")
fp = HandlerFileObject(self)
with open('/dev/zero', 'rb') as devzero:
for _ in range(100*1024):
fp.write(devzero.read(1024))
fp.close()
if __name__ == '__main__':
app = tornado.web.Application([
(r"/", DownloadHandler)
])
app.listen(8888)
tornado.ioloop.IOLoop.instance().start()
它有效,但問題是所有數據都被加載到RAM中,直到我停止應用程序才會釋放。 什么是更好/更慣用/更有資源的方式來解決這個問題?
調用fp.write()
時, get()
也需要是一個協程並且會產生。 通過編寫協程,你已經使你的對象不像文件一樣 - 大多數調用者只會忽略它的返回值,屏蔽異常並干擾流控制。 類文件接口是同步的,因此您可能需要在其他線程中執行這些操作,以便您可以根據需要阻止它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.