feat: 添加aiofiles支持以实现异步文件操作,优化文件上传性能

This commit is contained in:
Wenjie Zhang 2025-11-03 12:20:50 +08:00
parent 076e23eec3
commit 022eea8fde
3 changed files with 16 additions and 7 deletions

View File

@ -7,7 +7,6 @@
## Bugs
- [ ] upload 接口会阻塞主进程
- [ ] LightRAG 知识库查看不了解析后的文本,偶然出现,未复现
## Next
@ -41,4 +40,5 @@
- [x] 基于 create_agent 创建 SQL Viewer 智能体 <Badge type="info" text="0.3.5" />
- [x] 优化 MCP 逻辑,支持 common + special 创建方式 <Badge type="info" text="0.3.5" />
- [x] 修复本地知识库的 metadata 和 向量数据库中不一致的情况。
- [x] v1 版本的 LangGraph 的工具渲染有问题
- [x] v1 版本的 LangGraph 的工具渲染有问题
- [x] upload 接口会阻塞主进程

View File

@ -58,6 +58,7 @@ dependencies = [
"pypinyin>=0.55.0",
"tomli",
"tomli-w",
"aiofiles>=24.1.0",
]
[tool.ruff]
line-length = 120 # 代码最大行宽

View File

@ -1,3 +1,4 @@
import aiofiles
import asyncio
import os
import traceback
@ -593,19 +594,26 @@ async def upload_file(
basename, ext = os.path.splitext(file.filename)
filename = f"{basename}_{hashstr(basename, 4, with_salt=True)}{ext}".lower()
file_path = os.path.join(upload_dir, filename)
os.makedirs(upload_dir, exist_ok=True)
# 在线程池中执行同步文件系统操作,避免阻塞事件循环
await asyncio.to_thread(os.makedirs, upload_dir, exist_ok=True)
file_bytes = await file.read()
content_hash = calculate_content_hash(file_bytes)
if knowledge_base.file_existed_in_db(db_id, content_hash):
# 在线程池中执行计算密集型操作,避免阻塞事件循环
content_hash = await asyncio.to_thread(calculate_content_hash, file_bytes)
# 在线程池中执行同步数据库查询,避免阻塞事件循环
file_exists = await asyncio.to_thread(knowledge_base.file_existed_in_db, db_id, content_hash)
if file_exists:
raise HTTPException(
status_code=409,
detail="数据库中已经存在了相同文件File with the same content already exists in this database",
)
with open(file_path, "wb") as buffer:
buffer.write(file_bytes)
# 使用异步文件写入,避免阻塞事件循环
async with aiofiles.open(file_path, "wb") as buffer:
await buffer.write(file_bytes)
return {
"message": "File successfully uploaded",