Follow-up from PR #50 (judy review).
forge_favorites.list_with_status 用 asyncio.wait_for(loop.run_in_executor(None, os.stat)) + 100ms timeout。timeout 触发时 executor 那个 sync 线程继续阻塞在 stat 直到底层 syscall 返回(asyncio 没法 cancel 同步任务)。
极端场景:scott 50 条收藏全在 spin-down 盘上 → 50 个线程挂在默认 ThreadPoolExecutor 里 30s+,后续 GET 把 pool 耗光。当前 server 不是 asyncio HTTP,影响小,但可以:
- 换专用
ThreadPoolExecutor(max_workers=N)
- 或硬 timeout(cap 收藏总数 + 短路)
挂在 alice 的 backlog 里。
Follow-up from PR #50 (judy review).
forge_favorites.list_with_status用asyncio.wait_for(loop.run_in_executor(None, os.stat))+ 100ms timeout。timeout 触发时 executor 那个 sync 线程继续阻塞在 stat 直到底层 syscall 返回(asyncio 没法 cancel 同步任务)。极端场景:scott 50 条收藏全在 spin-down 盘上 → 50 个线程挂在默认 ThreadPoolExecutor 里 30s+,后续 GET 把 pool 耗光。当前 server 不是 asyncio HTTP,影响小,但可以:
ThreadPoolExecutor(max_workers=N)挂在 alice 的 backlog 里。