update pay ui

This commit is contained in:
2025-12-11 23:10:58 +08:00
parent 870b266a31
commit 9d095be968
3 changed files with 43 additions and 24 deletions

54
app.py
View File

@@ -1,28 +1,44 @@
# ============ Gevent Monkey Patching必须放在所有 import 之前!)============
# 用于支持 Gunicorn + gevent 异步模式,使 requests 等阻塞调用变为非阻塞
# 注意:如果使用 GeventWebSocketWorkerworker 会自动 patch这里检测避免重复
# ============ Eventlet/Gevent Monkey Patching必须放在所有 import 之前!)============
# 用于支持 Gunicorn + eventlet/gevent 异步模式,使 requests 等阻塞调用变为非阻塞
import os
import sys
def _is_already_patched():
"""检测是否已经被 gevent patch"""
def _detect_async_env():
"""检测当前异步环境"""
# 检测 eventlet
try:
from gevent import monkey
return monkey.is_module_patched('socket')
except:
return False
# 只在未被 patch 且明确启用时才 patch
if os.environ.get('GEVENT_SUPPORT', 'false').lower() == 'true' and not _is_already_patched():
try:
from gevent import monkey
monkey.patch_all(thread=False, subprocess=False) # 避免 patch 某些可能有问题的模块
print("✅ Gevent monkey patching 已启用 (手动)")
import eventlet
if hasattr(eventlet, 'is_monkey_patched') and eventlet.is_monkey_patched('socket'):
return 'eventlet_patched'
return 'eventlet_available'
except ImportError:
print("⚠️ Gevent 未安装,跳过 monkey patching")
elif _is_already_patched():
pass
# 检测 gevent
try:
from gevent import monkey
if monkey.is_module_patched('socket'):
return 'gevent_patched'
return 'gevent_available'
except ImportError:
pass
return 'none'
_async_env = _detect_async_env()
# Gunicorn eventlet worker 会自动 patch这里只打印状态
if _async_env == 'eventlet_patched':
print("✅ Eventlet monkey patching 已由 Worker 启用")
elif _async_env == 'gevent_patched':
print("✅ Gevent monkey patching 已由 Worker 启用")
# ============ Gevent Monkey Patching 结束 ============
elif _async_env == 'eventlet_available':
print("📡 Eventlet 可用,等待 Gunicorn worker 初始化")
elif _async_env == 'gevent_available':
print("📡 Gevent 可用,等待 Gunicorn worker 初始化")
else:
print("⚠️ 未检测到 eventlet 或 gevent将使用 threading 模式")
# ============ Monkey Patching 检测结束 ============
import base64
import csv

View File

@@ -23,13 +23,15 @@ import os
bind = '0.0.0.0:5001'
# Worker 进程数
# 对于 16 核心机器,使用 4-8 个 gevent workers 即可(每个可处理数千并发)
# 建议: min(8, CPU_CORES / 2) 因为 gevent 本身是异步的,不需要太多进程
workers = 4 # 4 个 gevent workers每个可处理 2000 并发连接 = 8000 总并发
# 重要: Flask-SocketIO + eventlet 使用多 worker 时需要 Redis 消息队列
# 单 worker + eventlet 可以处理数千并发连接(异步 I/O
# 多 worker 需要设置环境变量: SOCKETIO_USE_QUEUE=true
workers = 1 # 默认单 worker启用消息队列后可改为 4
# Worker 类型 - 使用 gevent(新版 Flask-SocketIO 不需要 geventwebsocket
# Worker 类型 - 使用 eventlet完整支持 WebSocket
# 参考: https://flask-socketio.readthedocs.io/en/latest/deployment.html
worker_class = 'gevent'
# 注意: eventlet 模式下建议使用单 worker多 worker 需要 Redis 消息队列
worker_class = 'eventlet'
# Worker 连接数gevent 异步模式下可以处理大量并发连接)
worker_connections = 2000

View File

@@ -19,6 +19,7 @@ celery==5.3.4
PyMySQL==1.1.0
gevent==23.9.1
gevent-websocket==0.10.1
eventlet==0.33.3
psutil==5.9.6
Pillow==10.1.0
itsdangerous==2.1.2