使用 FastApi 在单独的线程中下载大文件

问题描述 投票:0回答:1

这是我第一次在这里发布问题,所以如果我错过了某些细节,请原谅我。如果需要,我会更新我的问题。 所以我想要的是能够在应用程序启动时下载大文件,但它应该并行发生。因为在实际的应用程序启动中不应等待文件下载完成。

我目前正在做的是

from fastapi import FastAPI


app = FastAPI()

items = {}


@app.on_event("startup")
def startup_event():
    //Download file

现在这似乎有效,但我遇到了很多严重的工作超时错误。我想知道是否有某种方法可以在应用程序启动时进行下载,但又不会使应用程序等待下载完成。

python python-3.x asynchronous server fastapi
1个回答
0
投票

例如,在启动时下载 10GB 文件 (https://speed.hetzner.de/10GB.bin)。

应用程序启动时,它会使用

aiohttp
触发异步下载任务,从
https://speed.hetzner.de/10GB.bin
获取文件并将其保存为 download_file。

下载以块的形式进行,此后台进程允许应用程序启动其他任务并响应传入请求,而无需等待下载完成。

import asyncio
from fastapi import FastAPI
import aiohttp

app = FastAPI()

async def download_large_file():
    async with aiohttp.ClientSession() as session:
        url = "https://speed.hetzner.de/10GB.bin"
        async with session.get(url) as response:
            if response.status == 200:
                with open('downloaded_file', 'wb') as file:
                    while True:
                        chunk = await response.content.read(1024)
                        if not chunk:
                            break
                        file.write(chunk)

@app.on_event("startup")
async def startup_event():
    loop = asyncio.get_event_loop()
    loop.create_task(download_large_file())

希望这段代码有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.