tornado:如何创建写入请求处理程序的类似文件的对象?

2024-06-25 22:35:08 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的应用程序中,我试图创建一个处理程序,将大文件流式传输到客户机。{这些文件由另一个模块创建。在

我想要的是一个类似文件的对象,它不是写入套接字或磁盘上的实际文件,而是代理到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中,直到我停止应用程序才会被释放。 有什么更好的/更惯用的/足智多谋的方法?在


Tags: 文件方法importselfweb应用程序deftornado
1条回答
网友
1楼 · 发布于 2024-06-25 22:35:08

当调用get()时,get()也需要是协程和yield。通过使write-a-coroutine成为一个无对象文件,大多数调用方都会忽略它的返回值,屏蔽异常并干扰流控制。类似文件的接口是同步的,因此您可能需要在其他线程中执行这些操作,以便根据需要阻止它们。在

相关问题 更多 >