簡體   English   中英

tornado:如何創建寫入RequestHandler的類文件對象?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM