Optimize scheduler status lookups
This commit is contained in:
@@ -40,6 +40,7 @@ from db.accounts import (
|
|||||||
delete_user_accounts,
|
delete_user_accounts,
|
||||||
get_account,
|
get_account,
|
||||||
get_account_status,
|
get_account_status,
|
||||||
|
get_account_status_batch,
|
||||||
get_user_accounts,
|
get_user_accounts,
|
||||||
increment_account_login_fail,
|
increment_account_login_fail,
|
||||||
reset_account_login_status,
|
reset_account_login_status,
|
||||||
|
|||||||
@@ -140,6 +140,36 @@ def get_account_status(account_id):
|
|||||||
return cursor.fetchone()
|
return cursor.fetchone()
|
||||||
|
|
||||||
|
|
||||||
|
def get_account_status_batch(account_ids):
|
||||||
|
"""批量获取账号状态信息"""
|
||||||
|
account_ids = [str(account_id) for account_id in (account_ids or []) if account_id]
|
||||||
|
if not account_ids:
|
||||||
|
return {}
|
||||||
|
|
||||||
|
results = {}
|
||||||
|
chunk_size = 900 # 避免触发 SQLite 绑定参数上限
|
||||||
|
with db_pool.get_db() as conn:
|
||||||
|
cursor = conn.cursor()
|
||||||
|
for idx in range(0, len(account_ids), chunk_size):
|
||||||
|
chunk = account_ids[idx : idx + chunk_size]
|
||||||
|
placeholders = ",".join("?" for _ in chunk)
|
||||||
|
cursor.execute(
|
||||||
|
f"""
|
||||||
|
SELECT id, status, login_fail_count, last_login_error
|
||||||
|
FROM accounts
|
||||||
|
WHERE id IN ({placeholders})
|
||||||
|
""",
|
||||||
|
chunk,
|
||||||
|
)
|
||||||
|
for row in cursor.fetchall():
|
||||||
|
row_dict = dict(row)
|
||||||
|
account_id = str(row_dict.pop("id", ""))
|
||||||
|
if account_id:
|
||||||
|
results[account_id] = row_dict
|
||||||
|
|
||||||
|
return results
|
||||||
|
|
||||||
|
|
||||||
def delete_user_accounts(user_id):
|
def delete_user_accounts(user_id):
|
||||||
"""删除用户的所有账号"""
|
"""删除用户的所有账号"""
|
||||||
with db_pool.get_db() as conn:
|
with db_pool.get_db() as conn:
|
||||||
@@ -147,4 +177,3 @@ def delete_user_accounts(user_id):
|
|||||||
cursor.execute("DELETE FROM accounts WHERE user_id = ?", (user_id,))
|
cursor.execute("DELETE FROM accounts WHERE user_id = ?", (user_id,))
|
||||||
conn.commit()
|
conn.commit()
|
||||||
return cursor.rowcount
|
return cursor.rowcount
|
||||||
|
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ services:
|
|||||||
# 数据库配置
|
# 数据库配置
|
||||||
- DB_FILE=data/app_data.db
|
- DB_FILE=data/app_data.db
|
||||||
- DB_POOL_SIZE=5
|
- DB_POOL_SIZE=5
|
||||||
|
- SYSTEM_CONFIG_CACHE_TTL_SECONDS=30
|
||||||
# 并发控制配置
|
# 并发控制配置
|
||||||
- MAX_CONCURRENT_GLOBAL=2
|
- MAX_CONCURRENT_GLOBAL=2
|
||||||
- MAX_CONCURRENT_PER_ACCOUNT=1
|
- MAX_CONCURRENT_PER_ACCOUNT=1
|
||||||
@@ -45,6 +46,8 @@ services:
|
|||||||
- LOG_FILE=logs/app.log
|
- LOG_FILE=logs/app.log
|
||||||
- API_DIAGNOSTIC_LOG=0
|
- API_DIAGNOSTIC_LOG=0
|
||||||
- API_DIAGNOSTIC_SLOW_MS=0
|
- API_DIAGNOSTIC_SLOW_MS=0
|
||||||
|
# 状态推送节流(秒)
|
||||||
|
- STATUS_PUSH_INTERVAL_SECONDS=2
|
||||||
# wkhtmltoimage 截图配置
|
# wkhtmltoimage 截图配置
|
||||||
- WKHTMLTOIMAGE_FULL_PAGE=0
|
- WKHTMLTOIMAGE_FULL_PAGE=0
|
||||||
# 知识管理平台配置
|
# 知识管理平台配置
|
||||||
|
|||||||
@@ -87,19 +87,32 @@ def run_scheduled_task(skip_weekday_check: bool = False) -> None:
|
|||||||
cfg = database.get_system_config()
|
cfg = database.get_system_config()
|
||||||
enable_screenshot_scheduled = cfg.get("enable_screenshot", 0) == 1
|
enable_screenshot_scheduled = cfg.get("enable_screenshot", 0) == 1
|
||||||
|
|
||||||
|
user_accounts = {}
|
||||||
|
account_ids = []
|
||||||
for user in approved_users:
|
for user in approved_users:
|
||||||
user_id = user["id"]
|
user_id = user["id"]
|
||||||
accounts = safe_get_user_accounts_snapshot(user_id)
|
accounts = safe_get_user_accounts_snapshot(user_id)
|
||||||
if not accounts:
|
if not accounts:
|
||||||
load_user_accounts(user_id)
|
load_user_accounts(user_id)
|
||||||
accounts = safe_get_user_accounts_snapshot(user_id)
|
accounts = safe_get_user_accounts_snapshot(user_id)
|
||||||
|
if accounts:
|
||||||
|
user_accounts[user_id] = accounts
|
||||||
|
account_ids.extend(list(accounts.keys()))
|
||||||
|
|
||||||
|
account_statuses = database.get_account_status_batch(account_ids)
|
||||||
|
|
||||||
|
for user in approved_users:
|
||||||
|
user_id = user["id"]
|
||||||
|
accounts = user_accounts.get(user_id, {})
|
||||||
|
if not accounts:
|
||||||
|
continue
|
||||||
for account_id, account in accounts.items():
|
for account_id, account in accounts.items():
|
||||||
total_accounts += 1
|
total_accounts += 1
|
||||||
|
|
||||||
if account.is_running:
|
if account.is_running:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
account_status_info = database.get_account_status(account_id)
|
account_status_info = account_statuses.get(str(account_id))
|
||||||
if account_status_info:
|
if account_status_info:
|
||||||
status = account_status_info["status"] if "status" in account_status_info.keys() else "active"
|
status = account_status_info["status"] if "status" in account_status_info.keys() else "active"
|
||||||
if status == "suspended":
|
if status == "suspended":
|
||||||
|
|||||||
Reference in New Issue
Block a user