gpt4 book ai didi

python - Tornado :如何创建写入 RequestHandler 的类文件对象?

转载 作者:行者123 更新时间:2023-11-30 23:21:27 25 4
gpt4 key购买 nike

在我的应用程序中,我尝试创建一个处理程序,将大文件流式传输到客户端。这些文件是由另一个模块创建的(确切地说是 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 中,并且在我停止应用程序之前不会释放。什么是更好/更惯用/足智多谋的方式来解决这个问题?

最佳答案

get() 在调用 fp.write() 时也需要是一个协程并让出。通过使 write 成为协程,您可以使对象不再像文件一样 - 大多数调用者将简单地忽略它的返回值,屏蔽异常并干扰流控制。类似文件的接口(interface)是同步的,因此您可能需要在其他线程中执行这些操作,以便您可以根据需要阻止它们。

关于python - Tornado :如何创建写入 RequestHandler 的类文件对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24957808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com