refactor: 引入 safe_create_task 防止后台任务被 GC 回收,降低默认连接池和 worker 数量

- 新增 safe_create_task 统一替代裸 asyncio.create_task,通过全局集合持有 task 引用
- 默认 worker 数量从 4 降为 1,HTTP 连接池总预算从 800 降为 200
- 为 health_cache 和 affinity_manager 内存缓存增加上限淘汰机制
- MemoryCachePlugin 支持延迟启动清理任务
- gunicorn when_ready 增加 gc.collect() 并记录 post_worker_init RSS
This commit is contained in:
fawney19
2026-03-10 14:42:33 +08:00
parent 2d846b2c58
commit cfa5535f6e
22 changed files with 189 additions and 101 deletions
+24
View File
@@ -4,6 +4,8 @@
提供在异步上下文中安全执行同步函数的工具,避免阻塞事件循环。
"""
from __future__ import annotations
import asyncio
from collections.abc import Callable, Coroutine
from functools import partial, wraps
@@ -11,6 +13,28 @@ from typing import Any, TypeVar
T = TypeVar("T")
# 全局 task 引用集合,防止 fire-and-forget task 被 GC 回收
_background_tasks: set[asyncio.Task[Any]] = set()
def safe_create_task(coro: Coroutine[Any, Any, Any]) -> asyncio.Task[Any] | None:
"""创建后台 task 并持有引用,防止被 GC 回收。
用于 fire-and-forget 场景(如缓存失效、异步指标上报等),
替代裸 ``asyncio.create_task()`` 调用。
Returns:
创建的 Task 对象;若没有运行中的事件循环则返回 None。
"""
try:
loop = asyncio.get_running_loop()
except RuntimeError:
return None
task = loop.create_task(coro)
_background_tasks.add(task)
task.add_done_callback(_background_tasks.discard)
return task
async def run_in_executor(func: Callable[..., T], *args: Any, **kwargs: Any) -> T:
"""
+3 -6
View File
@@ -1,6 +1,5 @@
from __future__ import annotations
import asyncio
import random
import time
from typing import Any
@@ -131,8 +130,6 @@ class PerfRecorder:
@staticmethod
def _create_task(coro: Any) -> None:
try:
loop = asyncio.get_running_loop()
except RuntimeError:
return
loop.create_task(coro)
from src.utils.async_utils import safe_create_task
safe_create_task(coro)