feat: add concurrency safety, caption detection, admin enhancements, and performance improvements

This commit is contained in:
2026-06-14 22:20:02 +08:00
parent 8f13c31991
commit 29fb20828e
23 changed files with 1782 additions and 114 deletions
+32
View File
@@ -366,6 +366,38 @@ class TestSummarizeOneFlow:
result = await summarize_one(db_session, sample_paper)
assert result["status"] == "skipped"
@pytest.mark.asyncio
async def test_post_processing_runs_in_thread(
self, db_session, sample_paper, mock_pi_output, _summarize_tmp_paths
):
"""后处理(图片提取/ChromaDB)在工作线程而非事件循环线程执行。"""
import threading
seen_threads: list[int] = []
main_thread = threading.current_thread().ident
def spy_extract(arxiv_id, schema):
seen_threads.append(threading.current_thread().ident)
with (
patch("app.services.summarizer.download_pdf", new_callable=AsyncMock),
patch(
"app.services.summary_generator.call_pi",
new_callable=AsyncMock,
return_value=(mock_pi_output, "test-session-id"),
),
patch(
"app.services.summary_persister._maybe_extract_images",
side_effect=spy_extract,
),
patch("app.services.summary_persister._maybe_index_chroma"),
):
result = await summarize_one(db_session, sample_paper)
assert result["status"] == "done"
assert seen_threads, "后处理未被调用"
assert seen_threads[0] != main_thread, "后处理应在工作线程执行,不阻塞事件循环"
# ═══════════════════════════════════════════════════════════════════════
# 批量操作测试