add gpuusage的逻辑

Change-Id: Ie1634a7d58ab94b05a3ebd7de87d362ca9be2286
diff --git a/Merge/back_rhj/app.py b/Merge/back_rhj/app.py
index df7a598..967b921 100644
--- a/Merge/back_rhj/app.py
+++ b/Merge/back_rhj/app.py
@@ -1,6 +1,47 @@
 from app import create_app
+from flask_cors import CORS
+import os
+import psutil
+import time
+import GPUtil
+from flask import g, request
+from sqlalchemy import create_engine
+from sqlalchemy.orm import sessionmaker
+from config import Config
+from app.utils.gpuwriter import GpuWriter
 
 app = create_app()
+CORS(app,
+     resources={r"/*": {"origins": "*"}},
+     supports_credentials=True,
+     allow_headers=["Content-Type", "Authorization"]
+)
+
+proc = psutil.Process(os.getpid())
+
+@app.before_request
+def before_request():
+    g.start_time = time.time()
+    g.start_cpu = proc.cpu_times()
+    g.start_mem = proc.memory_info()
+
+@app.after_request
+def after_request(response):
+    try:
+        # 记录GPU使用情况
+        gpu_writer = GpuWriter(Config.SQLURL)
+        gpus = GPUtil.getGPUs()
+        
+        for gpu in gpus:
+            gpu_writer.write_gpu_usage(
+                gpu_id=gpu.id,
+                gpu_usage=gpu.load * 100,  # 转换为百分比
+                gpu_memory_usage=gpu.memoryUsed  # MB
+            )
+    except Exception as e:
+        print(f"GPU使用情况记录失败: {e}")
+    
+    return response
 
 if __name__ == "__main__":
     app.run(debug=True,port=8082,host='0.0.0.0')
\ No newline at end of file
diff --git a/Merge/back_rhj/app/__pycache__/__init__.cpython-310.pyc b/Merge/back_rhj/app/__pycache__/__init__.cpython-310.pyc
index bc775fd..08f5017 100644
--- a/Merge/back_rhj/app/__pycache__/__init__.cpython-310.pyc
+++ b/Merge/back_rhj/app/__pycache__/__init__.cpython-310.pyc
Binary files differ
diff --git a/Merge/back_rhj/app/__pycache__/routes.cpython-310.pyc b/Merge/back_rhj/app/__pycache__/routes.cpython-310.pyc
index f5aa9b3..46bb4b4 100644
--- a/Merge/back_rhj/app/__pycache__/routes.cpython-310.pyc
+++ b/Merge/back_rhj/app/__pycache__/routes.cpython-310.pyc
Binary files differ
diff --git a/Merge/back_rhj/app/models/__pycache__/gpu_usage.cpython-310.pyc b/Merge/back_rhj/app/models/__pycache__/gpu_usage.cpython-310.pyc
new file mode 100644
index 0000000..79f092a
--- /dev/null
+++ b/Merge/back_rhj/app/models/__pycache__/gpu_usage.cpython-310.pyc
Binary files differ
diff --git a/Merge/back_rhj/app/models/gpu_usage.py b/Merge/back_rhj/app/models/gpu_usage.py
new file mode 100644
index 0000000..0ac5cfa
--- /dev/null
+++ b/Merge/back_rhj/app/models/gpu_usage.py
@@ -0,0 +1,18 @@
+from sqlalchemy import Column, Integer, DECIMAL, TIMESTAMP, text
+from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy.sql import func
+
+Base = declarative_base()
+
+class GpuUsage(Base):
+    __tablename__ = 'gpu_usage'
+    __table_args__ = {
+        'mysql_engine': 'InnoDB',
+        'mysql_charset': 'utf8mb4',
+        'comment': 'GPU 使用情况表'
+    }
+    
+    gpu_id = Column(Integer, primary_key=True, nullable=False, comment='GPU 编号')
+    gpu_usage = Column(DECIMAL(5, 2), nullable=False, comment='GPU 使用率,单位:百分比')
+    gpu_memory_usage = Column(Integer, nullable=False, comment='GPU 内存用量,单位:MB')
+    created_at = Column(TIMESTAMP, nullable=False, server_default=text('CURRENT_TIMESTAMP'), comment='记录时间戳')
diff --git a/Merge/back_rhj/app/models/recall/__pycache__/swing_recall.cpython-310.pyc b/Merge/back_rhj/app/models/recall/__pycache__/swing_recall.cpython-310.pyc
index 5cd2aee..f50ef90 100644
--- a/Merge/back_rhj/app/models/recall/__pycache__/swing_recall.cpython-310.pyc
+++ b/Merge/back_rhj/app/models/recall/__pycache__/swing_recall.cpython-310.pyc
Binary files differ
diff --git a/Merge/back_rhj/app/routes.py b/Merge/back_rhj/app/routes.py
index 6f159ca..0b60624 100644
--- a/Merge/back_rhj/app/routes.py
+++ b/Merge/back_rhj/app/routes.py
@@ -2,6 +2,7 @@
 from .functions.FAuth import FAuth
 from app.services.recommendation_service import RecommendationService
 from app.utils.graph_build import build_user_post_graph
+from app.utils.gpuwriter import GpuWriter
 from sqlalchemy import create_engine
 from sqlalchemy.orm import sessionmaker
 from config import Config
@@ -409,3 +410,37 @@
             'success': False, 
             'message': f'推荐获取失败: {str(e)}'
         }), 500
+
+@main.route('/gpu-usage', methods=['GET'])
+@token_required
+def get_gpu_usage(current_user):
+    """获取最新GPU使用情况接口"""
+    try:
+        limit = request.args.get('limit', 100, type=int)
+        
+        # 限制最大获取条数
+        if limit > 1000:
+            limit = 1000
+            
+        print(f"获取最新 {limit} 条GPU使用记录")
+        
+        # 创建GpuWriter实例并获取数据
+        gpu_writer = GpuWriter(Config.SQLURL)
+        gpu_records = gpu_writer.get_latest_gpu_usage(limit)
+        
+        return jsonify({
+            'success': True,
+            'data': {
+                'records': gpu_records,
+                'count': len(gpu_records),
+                'limit': limit
+            },
+            'message': 'GPU使用情况获取成功'
+        }), 200
+        
+    except Exception as e:
+        print(f"获取GPU使用情况错误: {str(e)}")
+        return jsonify({
+            'success': False, 
+            'message': f'获取GPU使用情况失败: {str(e)}'
+        }), 500
diff --git a/Merge/back_rhj/app/services/__pycache__/lightgcn_scorer.cpython-310.pyc b/Merge/back_rhj/app/services/__pycache__/lightgcn_scorer.cpython-310.pyc
index 495528d..c98aaf5 100644
--- a/Merge/back_rhj/app/services/__pycache__/lightgcn_scorer.cpython-310.pyc
+++ b/Merge/back_rhj/app/services/__pycache__/lightgcn_scorer.cpython-310.pyc
Binary files differ
diff --git a/Merge/back_rhj/app/services/__pycache__/recommendation_service.cpython-310.pyc b/Merge/back_rhj/app/services/__pycache__/recommendation_service.cpython-310.pyc
index 88ab960..1424b42 100644
--- a/Merge/back_rhj/app/services/__pycache__/recommendation_service.cpython-310.pyc
+++ b/Merge/back_rhj/app/services/__pycache__/recommendation_service.cpython-310.pyc
Binary files differ
diff --git a/Merge/back_rhj/app/utils/__pycache__/gpuwriter.cpython-310.pyc b/Merge/back_rhj/app/utils/__pycache__/gpuwriter.cpython-310.pyc
new file mode 100644
index 0000000..f86da67
--- /dev/null
+++ b/Merge/back_rhj/app/utils/__pycache__/gpuwriter.cpython-310.pyc
Binary files differ
diff --git a/Merge/back_rhj/app/utils/gpuwriter.py b/Merge/back_rhj/app/utils/gpuwriter.py
new file mode 100644
index 0000000..1e521f3
--- /dev/null
+++ b/Merge/back_rhj/app/utils/gpuwriter.py
@@ -0,0 +1,68 @@
+from sqlalchemy.orm import sessionmaker
+from sqlalchemy import create_engine
+from app.models.gpu_usage import GpuUsage
+import logging
+
+class GpuWriter:
+    def __init__(self, database_url):
+        """
+        初始化 GpuWriter
+        :param database_url: 数据库连接URL
+        """
+        self.engine = create_engine(database_url)
+        self.Session = sessionmaker(bind=self.engine)
+    
+    def write_gpu_usage(self, gpu_id, gpu_usage, gpu_memory_usage):
+        """
+        写入GPU使用情况到数据库
+        :param gpu_id: GPU编号
+        :param gpu_usage: GPU使用率(百分比)
+        :param gpu_memory_usage: GPU内存用量(MB)
+        :return: bool 是否写入成功
+        """
+        session = self.Session()
+        try:
+            gpu_record = GpuUsage(
+                gpu_id=gpu_id,
+                gpu_usage=gpu_usage,
+                gpu_memory_usage=gpu_memory_usage
+            )
+            session.add(gpu_record)
+            session.commit()
+            return True
+        except Exception as e:
+            session.rollback()
+            logging.error(f"写入GPU使用情况失败: {e}")
+            return False
+        finally:
+            session.close()
+
+    def get_latest_gpu_usage(self, limit=100):
+        """
+        获取最新的GPU使用情况记录
+        :param limit: 获取记录条数,默认100条
+        :return: list 包含GPU使用记录的字典列表
+        """
+        session = self.Session()
+        try:
+            records = session.query(GpuUsage)\
+                           .order_by(GpuUsage.timestamp.desc())\
+                           .limit(limit)\
+                           .all()
+            
+            result = []
+            for record in records:
+                result.append({
+                    'id': record.id,
+                    'gpu_id': record.gpu_id,
+                    'gpu_usage': record.gpu_usage,
+                    'gpu_memory_usage': record.gpu_memory_usage,
+                    'timestamp': record.timestamp.isoformat() if record.timestamp else None
+                })
+            
+            return result
+        except Exception as e:
+            logging.error(f"获取GPU使用情况失败: {e}")
+            return []
+        finally:
+            session.close()