更新Company页面的UI为FUI风格

This commit is contained in:
2025-12-18 22:06:22 +08:00
parent c7033481ee
commit 25b2c2af49
2 changed files with 30 additions and 20 deletions

22
app.py
View File

@@ -220,11 +220,12 @@ load_trading_days()
engine = create_engine( engine = create_engine(
"mysql+pymysql://root:Zzl33818!@127.0.0.1:3306/stock?charset=utf8mb4", "mysql+pymysql://root:Zzl33818!@127.0.0.1:3306/stock?charset=utf8mb4",
echo=False, echo=False,
pool_size=10, pool_size=50, # 每个 worker 常驻连接数
pool_recycle=3600, pool_recycle=1800, # 连接回收时间 30 分钟(原 1 小时)
pool_pre_ping=True, pool_pre_ping=True, # 使用前检测连接是否有效
pool_timeout=30, pool_timeout=20, # 获取连接超时时间(秒)
max_overflow=20 max_overflow=100 # 每个 worker 临时溢出连接数
# 每个 worker 最多 150 个连接32 workers 总共最多 4800 个连接
) )
# Elasticsearch 客户端初始化 # Elasticsearch 客户端初始化
@@ -709,11 +710,12 @@ app.config['COMPRESS_MIMETYPES'] = [
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:Zzl33818!@127.0.0.1:3306/stock?charset=utf8mb4' app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:Zzl33818!@127.0.0.1:3306/stock?charset=utf8mb4'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_ENGINE_OPTIONS'] = { app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {
'pool_size': 10, 'pool_size': 50, # 每个 worker 常驻连接数
'pool_recycle': 3600, 'pool_recycle': 1800, # 连接回收时间 30 分钟(原 1 小时)
'pool_pre_ping': True, 'pool_pre_ping': True, # 使用前检测连接是否有效
'pool_timeout': 30, 'pool_timeout': 20, # 获取连接超时时间(秒)
'max_overflow': 20 'max_overflow': 100 # 每个 worker 临时溢出连接数
# 每个 worker 最多 150 个连接32 workers 总共最多 4800 个连接
} }
# Cache directory setup # Cache directory setup
CACHE_DIR = Path('cache') CACHE_DIR = Path('cache')

View File

@@ -1,9 +1,9 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
Gunicorn 配置文件 - Eventlet 极限高并发配置(110.42.32.207 专用) Gunicorn 配置文件 - Eventlet 高并发配置(48核128GB 专用)
服务器配置: 48核心 128GB 内存 服务器配置: 48核心 128GB 内存
目标并发: 160,000+ 并发连接 目标并发: 5,000-10,000 实际并发(理论 320,000 连接
使用方式: 使用方式:
# 设置环境变量后启动 # 设置环境变量后启动
@@ -14,10 +14,12 @@ Gunicorn 配置文件 - Eventlet 极限高并发配置110.42.32.207 专用)
REDIS_HOST=127.0.0.1 gunicorn -c gunicorn_eventlet_config.py app:app REDIS_HOST=127.0.0.1 gunicorn -c gunicorn_eventlet_config.py app:app
架构说明: 架构说明:
- 16 个 Eventlet Worker每个占用 1 核心,预留 32 核给系统/Redis/MySQL - 32 个 Eventlet Worker每个占用 1 核心,预留 16 核给系统/Redis/MySQL
- 每个 Worker 处理 10000+ 并发连接(协程异步 I/O - 每个 Worker 处理 10000+ 并发连接(协程异步 I/O
- 数据库连接池: 32 workers × 150 = 4800 连接(实际瓶颈)
- Redis 消息队列同步跨 Worker 的 WebSocket 消息 - Redis 消息队列同步跨 Worker 的 WebSocket 消息
- 并发能力: 16 × 10000 = 160,000+ 连接 - 理论并发能力: 32 × 10000 = 320,000 连接
- 实际并发能力: 5,000-10,000受数据库连接限制
""" """
import os import os
@@ -32,9 +34,9 @@ os.environ.setdefault('REDIS_HOST', '127.0.0.1')
bind = '0.0.0.0:5001' bind = '0.0.0.0:5001'
# Worker 进程数 # Worker 进程数
# 48 核心机器: 16 Workers预留资源给 Redis/MySQL/系统 # 48 核心机器: 32 Workers目标 5000-10000 并发
# 每个 Eventlet Worker 是单线程但支持协程并发 # 每个 Eventlet Worker 是单线程但支持协程并发
workers = 16 workers = 32
# Worker 类型 - eventlet 异步模式 # Worker 类型 - eventlet 异步模式
worker_class = 'eventlet' worker_class = 'eventlet'
@@ -97,14 +99,17 @@ def on_starting(server):
workers = server.app.cfg.workers workers = server.app.cfg.workers
connections = server.app.cfg.worker_connections connections = server.app.cfg.worker_connections
total = workers * connections total = workers * connections
db_pool = workers * 150 # pool_size=50 + max_overflow=100
print("=" * 70) print("=" * 70)
print("🚀 Gunicorn + Eventlet 极限高并发服务器正在启动...") print("🚀 Gunicorn + Eventlet 高并发服务器正在启动...")
print("=" * 70) print("=" * 70)
print(f" 服务器配置: 48核心 128GB 内存") print(f" 服务器配置: 48核心 128GB 内存")
print(f" Workers: {workers} 个 Eventlet 协程进程") print(f" Workers: {workers} 个 Eventlet 协程进程")
print(f" 每 Worker 连接数: {connections:,}") print(f" 每 Worker 连接数: {connections:,}")
print(f" 并发能力: {total:,} 连接") print(f" 理论并发能力: {total:,} 连接")
print(f" 数据库连接池: {db_pool:,} 连接(实际瓶颈)")
print(f" 目标实际并发: 5,000-10,000")
print("-" * 70) print("-" * 70)
print(f" Bind: {server.app.cfg.bind}") print(f" Bind: {server.app.cfg.bind}")
print(f" Max Requests: {server.app.cfg.max_requests:,}") print(f" Max Requests: {server.app.cfg.max_requests:,}")
@@ -122,18 +127,21 @@ def when_ready(server):
workers = server.app.cfg.workers workers = server.app.cfg.workers
connections = server.app.cfg.worker_connections connections = server.app.cfg.worker_connections
total = workers * connections total = workers * connections
db_pool = workers * 150
print("=" * 70) print("=" * 70)
print(f"✅ Gunicorn + Eventlet 服务准备就绪!") print(f"✅ Gunicorn + Eventlet 服务准备就绪!")
print(f" {workers} 个 Worker 已启动") print(f" {workers} 个 Worker 已启动")
print(f" 并发能力: {total:,} 连接") print(f" 理论并发能力: {total:,} 连接")
print(f" 数据库连接池: {db_pool:,} 连接")
print(f" 目标实际并发: 5,000-10,000")
print(f" WebSocket + HTTP API 混合高并发已启用") print(f" WebSocket + HTTP API 混合高并发已启用")
print("=" * 70) print("=" * 70)
def post_worker_init(worker): def post_worker_init(worker):
"""Worker 初始化完成后调用""" """Worker 初始化完成后调用"""
print(f"✅ Eventlet Worker {worker.pid} 已初始化 (10,000 并发连接就绪)") print(f"✅ Eventlet Worker {worker.pid} 已初始化 (10,000 并发连接 + 150 数据库连接就绪)")
# 触发事件轮询初始化(使用 Redis 锁确保只有一个 Worker 启动调度器) # 触发事件轮询初始化(使用 Redis 锁确保只有一个 Worker 启动调度器)
try: try: