这是我第一次在这里发布问题,所以如果我错过了某些细节,请原谅我。如果需要,我会更新我的问题。 所以我想要的是能够在应用程序启动时下载大文件,但它应该并行发生。因为在实际的应用程序启动中不应等待文件下载完成。
我目前正在做的是
from fastapi import FastAPI
app = FastAPI()
items = {}
@app.on_event("startup")
def startup_event():
//Download file
现在这似乎有效,但我遇到了很多严重的工作超时错误。我想知道是否有某种方法可以在应用程序启动时进行下载,但又不会使应用程序等待下载完成。
例如,在启动时下载 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())
希望这段代码有帮助。