更新Company页面的UI为FUI风格
This commit is contained in:
22
app.py
22
app.py
@@ -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')
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user