multithreading/log refactoring

This commit is contained in:
Vladless
2026-02-21 15:17:25 +03:00
parent 417566a202
commit e702d21c33
21 changed files with 238 additions and 226 deletions
+2 -9
View File
@@ -18,7 +18,7 @@ from api.depends import get_session, verify_admin_token, verify_admin_token_shor
from database import async_session_maker
from config import API_TOKEN, BOT_SERVICE
from core.bootstrap import MANAGEMENT_CONFIG
from core.executor import get_thread_pool
from core.executor import run_io
from core.settings.management_config import update_management_config
from database.models import Key, User
from database.models import Server
@@ -65,14 +65,7 @@ async def _restart_bot() -> None:
is_systemd = parent and "systemd" in parent.name().lower()
if is_systemd:
loop = asyncio.get_running_loop()
await loop.run_in_executor(
get_thread_pool(),
lambda: subprocess.run(
["sudo", "systemctl", "restart", BOT_SERVICE],
check=True,
),
)
await run_io(lambda: subprocess.run(["sudo", "systemctl", "restart", BOT_SERVICE], check=True))
else:
python_exe = sys.executable
script_path = os.path.abspath(sys.argv[0])
+10 -10
View File
@@ -6,6 +6,7 @@ from fastapi import APIRouter, Depends, HTTPException
from pydantic import BaseModel
from api.depends import verify_admin_token
from core.executor import run_io
from utils.modules_loader import _is_safe_module_name
from utils.modules_manager import manager
@@ -80,24 +81,23 @@ def _read_local_module_version(name: str) -> str | None:
return None
@router.get("/")
async def list_modules(admin=Depends(verify_admin_token)):
refresh = getattr(manager, "refresh_state", None)
def sync_list_modules() -> list:
"""Вся синхронная работа со списком модулей (файлы, состояние). Вызывать через run_io()."""
refresh = getattr(manager, "refresh_state", None) or getattr(manager, "_load_state", None)
if callable(refresh):
refresh()
else:
legacy_refresh = getattr(manager, "_load_state", None)
if callable(legacy_refresh):
legacy_refresh()
module_names = _available_module_names()
_prune_missing_state(set(module_names))
modules = [_module_state(name) for name in module_names]
for item in modules:
name = str(item.get("name") or "").strip()
local_version = _read_local_module_version(name)
item["local_version"] = local_version
item["local_version"] = _read_local_module_version(name)
return modules
@router.get("/")
async def list_modules(admin=Depends(verify_admin_token)):
modules = await run_io(sync_list_modules)
return {"items": modules}
+2 -9
View File
@@ -18,7 +18,7 @@ from api.depends import get_session, verify_identity_admin, verify_identity_admi
from database import async_session_maker
from config import API_TOKEN, BOT_SERVICE
from core.bootstrap import MANAGEMENT_CONFIG
from core.executor import get_thread_pool
from core.executor import run_io
from core.settings.management_config import update_management_config
from database.models import Key, Server, User
from handlers.admin.sender.sender_service import BroadcastService
@@ -64,14 +64,7 @@ async def _restart_bot() -> None:
parent = psutil.Process(os.getpid()).parent()
is_systemd = parent and "systemd" in parent.name().lower()
if is_systemd:
loop = asyncio.get_running_loop()
await loop.run_in_executor(
get_thread_pool(),
lambda: subprocess.run(
["sudo", "systemctl", "restart", BOT_SERVICE],
check=True,
),
)
await run_io(lambda: subprocess.run(["sudo", "systemctl", "restart", BOT_SERVICE], check=True))
else:
python_exe = sys.executable
script_path = os.path.abspath(sys.argv[0])
+12 -10
View File
@@ -6,6 +6,7 @@ from fastapi import APIRouter, Depends, HTTPException
from pydantic import BaseModel
from api.depends import verify_identity_admin
from core.executor import run_io
from utils.modules_loader import _is_safe_module_name
from utils.modules_manager import manager
@@ -77,23 +78,24 @@ def _read_local_module_version(name: str) -> str | None:
return None
@router.get("/")
async def list_modules(identity=Depends(verify_identity_admin)):
"""Список модулей с состоянием и локальной версией."""
refresh = getattr(manager, "refresh_state", None)
def sync_list_modules() -> list:
"""Вся синхронная работа со списком модулей (файлы, состояние). Вызывать через run_io()."""
refresh = getattr(manager, "refresh_state", None) or getattr(manager, "_load_state", None)
if callable(refresh):
refresh()
else:
legacy_refresh = getattr(manager, "_load_state", None)
if callable(legacy_refresh):
legacy_refresh()
module_names = _available_module_names()
_prune_missing_state(set(module_names))
modules = [_module_state(name) for name in module_names]
for item in modules:
name = str(item.get("name") or "").strip()
local_version = _read_local_module_version(name)
item["local_version"] = local_version
item["local_version"] = _read_local_module_version(name)
return modules
@router.get("/")
async def list_modules(identity=Depends(verify_identity_admin)):
"""Список модулей с состоянием и локальной версией."""
modules = await run_io(sync_list_modules)
return {"items": modules}