移除了不存在的属性引用 :删除了导致错误的 eventlet.greenthread.main 相关代码
This commit is contained in:
@@ -38,28 +38,32 @@ try:
|
|||||||
error_counts[error_key] = 1
|
error_counts[error_key] = 1
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# 4. 增强错误处理,确保所有绿色线程错误都被捕获
|
# 4. 只修改关键的 greenio 方法,确保在致命错误时彻底关闭连接
|
||||||
# 保存原始的 greenlet 主函数,包装它以捕获所有异常
|
# 增强 socketio 错误处理,确保不会因为单个连接错误而宕机
|
||||||
import eventlet.greenthread
|
|
||||||
original_main = eventlet.greenthread.main
|
|
||||||
|
|
||||||
def custom_greenthread_main(*args, **kwargs):
|
|
||||||
"""包装 greenlet 主函数,捕获所有异常,防止服务器宕机"""
|
|
||||||
try:
|
try:
|
||||||
return original_main(*args, **kwargs)
|
from flask_socketio import SocketIO
|
||||||
except Exception as e:
|
# 获取当前 socketio 实例并配置错误处理
|
||||||
# 捕获所有绿色线程中的异常
|
import sys
|
||||||
if not is_duplicate_error(e):
|
original_excepthook = sys.excepthook
|
||||||
print(f"[Eventlet GreenThread Error] {type(e).__name__}: {e}")
|
|
||||||
|
def custom_excepthook(exc_type, exc_value, exc_traceback):
|
||||||
|
"""全局异常钩子,捕获所有未处理的异常"""
|
||||||
|
if exc_type.__name__ in ['OSError', 'IOError'] and 'Bad file descriptor' in str(exc_value):
|
||||||
|
# 处理 Bad file descriptor 错误,不导致服务器宕机
|
||||||
|
if not is_duplicate_error(exc_value):
|
||||||
|
print(f"[Global Error Handler] {exc_type.__name__}: {exc_value}")
|
||||||
print("[Traceback]")
|
print("[Traceback]")
|
||||||
traceback.print_exc()
|
traceback.print_exception(exc_type, exc_value, exc_traceback)
|
||||||
# 返回 None 继续运行,防止服务器宕机
|
# 不调用原始的 excepthook,防止服务器宕机
|
||||||
return None
|
return
|
||||||
|
# 其他异常调用原始的 excepthook
|
||||||
|
original_excepthook(exc_type, exc_value, exc_traceback)
|
||||||
|
|
||||||
# 替换原始的 greenlet 主函数
|
# 设置全局异常钩子
|
||||||
eventlet.greenthread.main = custom_greenthread_main
|
sys.excepthook = custom_excepthook
|
||||||
|
except Exception as e:
|
||||||
# 5. 只修改关键的 greenio 方法,确保在致命错误时彻底关闭连接
|
# 如果修改失败,忽略错误
|
||||||
|
print(f"[Global Excepthook Patch Error] {e}")
|
||||||
from eventlet import greenio
|
from eventlet import greenio
|
||||||
|
|
||||||
# 保存并替换原始的 greenio 方法
|
# 保存并替换原始的 greenio 方法
|
||||||
|
|||||||
Reference in New Issue
Block a user