当前位置: 首页 > news >正文

使用 Python 监控系统资源

使用 Python 监控系统资源

在开发分布式系统或性能敏感的应用时,实时监控系统资源(如 CPU、内存、磁盘、网络和 GPU 使用率)至关重要。本文介绍一个基于 Python 的 SystemMonitor 类,它以单例模式持续采集系统资源信息,存储数据供外部访问,并集成日志记录功能。以下是其核心功能和使用方法。

功能概述

SystemMonitor 是一个轻量级的系统资源监控工具,具有以下特点:

  • 单例模式:全局只有一个实例,确保数据一致性。
  • 持续运行:初始化后自动开始监控,持续更新数据。
  • 数据存储:将最新资源信息存储在内存中,供外部通过方法访问。
  • 全面监控
    • CPU:使用率(百分比)。
    • 内存:总内存、已用内存和使用率(GB)。
    • 磁盘:总空间、已用空间和使用率(GB)。
    • 网络:上行和下行速率(MB/s)。
    • GPU:使用率和显存使用率(仅限 NVIDIA GPU)。

依赖安装

需要安装以下 Python 库:

pip install psutil pynvml
  • psutil:用于获取 CPU、内存、磁盘和网络信息。
  • pynvml:用于监控 NVIDIA GPU(可选,若无 GPU 自动跳过)。

核心代码

以下是 SystemMonitor 的代码。

import time
import psutil
import pynvml
import threading
from typing import Dict, Optional
from logger import LoggerManagerclass SystemMonitor:_instance = None_lock = threading.Lock()def __new__(cls, *args, **kwargs):with cls._lock:if cls._instance is None:cls._instance = super(SystemMonitor, cls).__new__(cls)return cls._instancedef __init__(self, interval: float = 1.0):"""初始化系统监控器(单例模式),自动开始持续监控。参数:interval: 采集数据的间隔时间(秒)"""if hasattr(self, '_initialized') and self._initialized:returnself._initialized = Trueself.logger = LoggerManager().get_logger("SYSTEM-MONITOR")self.interval = intervalself.last_net_io = psutil.net_io_counters()self._system_info = {}  # 存储最新系统资源信息self._info_lock = threading.Lock()  # 保护 _system_info 的读写self.logger.info("System monitor initialized")# 初始化 GPU 监控self.gpu_available = Falsetry:pynvml.nvmlInit()self.gpu_count = pynvml.nvmlDeviceGetCount()self.gpu_available = self.gpu_count > 0self.logger.info(f"Found {self.gpu_count} NVIDIA GPU(s)")except pynvml.NVMLError:self.logger.warning("NVIDIA GPU not available or driver not installed")# 启动监控线程self.running = Trueself.monitor_thread = threading.Thread(target=self._monitor_loop, daemon=True)self.monitor_thread.start()self.logger.info("System monitor thread started")def get_cpu_usage(self) -> float:"""获取 CPU 使用率(百分比)。"""return psutil.cpu_percent(interval=0.1)def get_memory_info(self) -> Dict[str, float]:"""获取内存信息(总内存、已用内存、使用率)。"""mem = psutil.virtual_memory()return {"total_gb": mem.total / (1024 ** 3),  # 转换为 GB"used_gb": mem.used / (1024 ** 3),"percent": mem.percent}def get_disk_info(self) -> Dict[str, float]:"""获取磁盘信息(总空间、已用空间、使用率)。"""disk = psutil.disk_usage('/')return {"total_gb": disk.total / (1024 ** 3),  # 转换为 GB"used_gb": disk.used / (1024 ** 3),"percent": disk.percent}def get_network_speed(self) -> Dict[str, float]:"""获取网络上行和下行速率(MB/s)。"""net_io = psutil.net_io_counters()bytes_sent = net_io.bytes_sent - self.last_net_io.bytes_sentbytes_recv = net_io.bytes_recv - self.last_net_io.bytes_recvelapsed = self.intervalself.last_net_io = net_ioreturn {"upload_mbps": (bytes_sent / elapsed) / (1024 ** 2),  # 转换为 MB/s"download_mbps": (bytes_recv / elapsed) / (1024 ** 2)}def get_gpu_info(self) -> Optional[Dict[str, float]]:"""获取 GPU 使用率和显存使用率(仅限 NVIDIA GPU)。"""if not self.gpu_available:return Nonegpu_info = []for i in range(self.gpu_count):handle = pynvml.nvmlDeviceGetHandleByIndex(i)util = pynvml.nvmlDeviceGetUtilizationRates(handle)mem = pynvml.nvmlDeviceGetMemoryInfo(handle)gpu_info.append({"gpu_id": i,"utilization_percent": util.gpu,"memory_total_mb": mem.total / (1024 ** 2),  # 转换为 MB"memory_used_mb": mem.used / (1024 ** 2),"memory_percent": (mem.used / mem.total) * 100})return gpu_infodef collect_and_log(self):"""采集所有系统资源信息,更新存储并记录日志。"""with self._info_lock:# CPUself._system_info["cpu_usage_percent"] = self.get_cpu_usage()# 内存self._system_info["memory"] = self.get_memory_info()# 磁盘self._system_info["disk"] = self.get_disk_info()# 网络self._system_info["network"] = self.get_network_speed()# GPUself._system_info["gpu"] = self.get_gpu_info()# 日志记录self.logger.info(f"CPU Usage: {self._system_info['cpu_usage_percent']:.1f}%")self.logger.info(f"Memory: {self._system_info['memory']['used_gb']:.2f}/"f"{self._system_info['memory']['total_gb']:.2f} GB "f"({self._system_info['memory']['percent']:.1f}%)")self.logger.info(f"Disk: {self._system_info['disk']['used_gb']:.2f}/"f"{self._system_info['disk']['total_gb']:.2f} GB "f"({self._system_info['disk']['percent']:.1f}%)")self.logger.info(f"Network: Upload {self._system_info['network']['upload_mbps']:.2f} MB/s, "f"Download {self._system_info['network']['download_mbps']:.2f} MB/s")if self._system_info["gpu"]:for gpu in self._system_info["gpu"]:self.logger.info(f"GPU {gpu['gpu_id']}: Utilization {gpu['utilization_percent']}%"f", Memory {gpu['memory_used_mb']:.1f}/"f"{gpu['memory_total_mb']:.1f} MB "f"({gpu['memory_percent']:.1f}%)")def _monitor_loop(self):"""监控循环,持续采集和更新系统资源信息。"""while self.running:self.collect_and_log()time.sleep(self.interval)def get_system_info(self) -> Dict:"""获取最新的系统资源信息。返回:包含 CPU、内存、磁盘、网络和 GPU 信息的字典"""with self._info_lock:return self._system_info.copy()def __del__(self):"""清理 GPU 资源。"""self.running = Falseif self.gpu_available:try:pynvml.nvmlShutdown()self.logger.info("NVIDIA GPU monitoring shutdown")except pynvml.NVMLError:self.logger.warning("Failed to shutdown NVIDIA GPU monitoring")

使用示例

以下是如何使用 SystemMonitor 监控系统资源并读取数据的示例:

from system_monitor import SystemMonitor
import time# 初始化(自动开始监控)
monitor = SystemMonitor(interval=1.0)# 读取数据
for _ in range(5):time.sleep(1.0)info = monitor.get_system_info()print(f"CPU: {info['cpu_usage_percent']:.1f}%")print(f"Network: Upload {info['network']['upload_mbps']:.2f} MB/s, "f"Download {info['network']['download_mbps']:.2f} MB/s")

输出示例:

CPU: 25.3%
Network: Upload 0.01 MB/s, Download 0.05 MB/s
...

界面显示

from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QLabel, QScrollArea, QApplication
from PySide6.QtCharts import QChart, QChartView, QLineSeries, QValueAxis
from PySide6.QtCore import QTimer, Qt
from PySide6.QtGui import QPainter
from system_monitor import SystemMonitorclass SystemMonitorWindow(QWidget):def __init__(self, parent=None):super().__init__(parent)self.setWindowTitle("System Monitor")self.setMinimumSize(1000, 600)self.monitor = SystemMonitor(interval=1.0)self.init_ui()self.start_timer()def init_ui(self):# 主布局main_layout = QVBoxLayout(self)# 滚动区域scroll_area = QScrollArea()scroll_area.setWidgetResizable(True)scroll_content = QWidget()content_layout = QVBoxLayout(scroll_content)# CPU 和 GPU 行cpu_gpu_layout = QHBoxLayout()self.cpu_label = QLabel("CPU Usage: N/A")self.cpu_label.setStyleSheet("color: #fff;")self.cpu_label.setAlignment(Qt.AlignCenter)self.gpu_label = QLabel("GPU: N/A")self.gpu_label.setStyleSheet("color: #fff;")self.gpu_label.setAlignment(Qt.AlignCenter)cpu_layout = QVBoxLayout()self.cpu_chart = self.create_chart("CPU Usage (%)", 0, 100)self.cpu_series = QLineSeries()self.cpu_chart.addSeries(self.cpu_series)self.cpu_chart.setAxisX(self.create_axis_x(), self.cpu_series)self.cpu_chart.setAxisY(self.create_axis_y("Usage (%)", 0, 100), self.cpu_series)cpu_chart_view = QChartView(self.cpu_chart)cpu_chart_view.setMinimumHeight(400)cpu_layout.addWidget(cpu_chart_view)cpu_layout.addWidget(self.cpu_label)gpu_layout = QVBoxLayout()self.gpu_chart = self.create_chart("GPU Usage (%)", 0, 100)self.gpu_series = QLineSeries()self.gpu_chart.addSeries(self.gpu_series)self.gpu_chart.setAxisX(self.create_axis_x(), self.gpu_series)self.gpu_chart.setAxisY(self.create_axis_y("Usage (%)", 0, 100), self.gpu_series)gpu_chart_view = QChartView(self.gpu_chart)gpu_chart_view.setMinimumHeight(400)gpu_layout.addWidget(gpu_chart_view)gpu_layout.addWidget(self.gpu_label)cpu_gpu_layout.addLayout(cpu_layout, 1)cpu_gpu_layout.addLayout(gpu_layout, 1)content_layout.addLayout(cpu_gpu_layout)# 内存和磁盘行memory_disk_layout = QHBoxLayout()self.memory_label = QLabel("Memory: N/A")self.memory_label.setStyleSheet("color: #fff;")self.memory_label.setAlignment(Qt.AlignCenter)self.disk_label = QLabel("Disk: N/A")self.disk_label.setStyleSheet("color: #fff;")self.disk_label.setAlignment(Qt.AlignCenter)memory_layout = QVBoxLayout()self.memory_chart = self.create_chart("Memory Usage (%)", 0, 100)self.memory_series = QLineSeries()self.memory_chart.addSeries(self.memory_series)self.memory_chart.setAxisX(self.create_axis_x(), self.memory_series)self.memory_chart.setAxisY(self.create_axis_y("Usage (%)", 0, 100), self.memory_series)memory_chart_view = QChartView(self.memory_chart)memory_chart_view.setMinimumHeight(400)memory_layout.addWidget(memory_chart_view)memory_layout.addWidget(self.memory_label)disk_layout = QVBoxLayout()self.disk_chart = self.create_chart("Disk Usage (%)", 0, 100)self.disk_series = QLineSeries()self.disk_chart.addSeries(self.disk_series)self.disk_chart.setAxisX(self.create_axis_x(), self.disk_series)self.disk_chart.setAxisY(self.create_axis_y("Usage (%)", 0, 100), self.disk_series)disk_chart_view = QChartView(self.disk_chart)disk_chart_view.setMinimumHeight(400)disk_layout.addWidget(disk_chart_view)disk_layout.addWidget(self.disk_label)memory_disk_layout.addLayout(memory_layout, 1)memory_disk_layout.addLayout(disk_layout, 1)content_layout.addLayout(memory_disk_layout)# 网络上行和下行行network_layout = QHBoxLayout()self.upload_label = QLabel("Upload: N/A")self.upload_label.setStyleSheet("color: #fff;")self.upload_label.setAlignment(Qt.AlignCenter)self.download_label = QLabel("Download: N/A")self.download_label.setStyleSheet("color: #fff;")self.download_label.setAlignment(Qt.AlignCenter)upload_layout = QVBoxLayout()self.upload_chart = self.create_chart("Network Upload (MB/s)", 0, 10)self.upload_series = QLineSeries()self.upload_chart.addSeries(self.upload_series)self.upload_chart.setAxisX(self.create_axis_x(), self.upload_series)self.upload_chart.setAxisY(self.create_axis_y("Speed (MB/s)", 0, 10), self.upload_series)upload_chart_view = QChartView(self.upload_chart)upload_chart_view.setMinimumHeight(400)upload_layout.addWidget(upload_chart_view)upload_layout.addWidget(self.upload_label)download_layout = QVBoxLayout()self.download_chart = self.create_chart("Network Download (MB/s)", 0, 10)self.download_series = QLineSeries()self.download_chart.addSeries(self.download_series)self.download_chart.setAxisX(self.create_axis_x(), self.download_series)self.download_chart.setAxisY(self.create_axis_y("Speed (MB/s)", 0, 10), self.download_series)download_chart_view = QChartView(self.download_chart)download_chart_view.setMinimumHeight(400)download_layout.addWidget(download_chart_view)download_layout.addWidget(self.download_label)network_layout.addLayout(upload_layout, 1)network_layout.addLayout(download_layout, 1)content_layout.addLayout(network_layout)content_layout.addStretch()scroll_area.setWidget(scroll_content)main_layout.addWidget(scroll_area)def create_chart(self, title: str, min_y: float, max_y: float) -> QChart:chart = QChart()chart.setTitle(title)chart.legend().setVisible(False)chart.setAnimationOptions(QChart.SeriesAnimations)return chartdef create_axis_x(self) -> QValueAxis:axis = QValueAxis()axis.setTitleText("Time (s)")axis.setRange(0, 60)axis.setTickCount(7)axis.setLabelsVisible(False)  # 隐藏刻度值return axisdef create_axis_y(self, title: str, min_y: float, max_y: float) -> QValueAxis:axis = QValueAxis()axis.setTitleText(title)axis.setRange(min_y, max_y)axis.setTickCount(11)# axis.setLabelsVisible(False)  # 隐藏刻度值return axisdef start_timer(self):self.timer = QTimer()self.timer.timeout.connect(self.update_ui)self.timer.start(1000)self.time_elapsed = 0def update_ui(self):info = self.monitor.get_system_info()self.time_elapsed += 1# 更新文本标签self.cpu_label.setText(f"CPU Usage: {info.get('cpu_usage_percent', 0):.1f}%")self.memory_label.setText(f"Memory: {info.get('memory', {}).get('used_gb', 0):.2f}/"f"{info.get('memory', {}).get('total_gb', 0):.2f} GB "f"({info.get('memory', {}).get('percent', 0):.1f}%)")self.disk_label.setText(f"Disk: {info.get('disk', {}).get('used_gb', 0):.2f}/"f"{info.get('disk', {}).get('total_gb', 0):.2f} GB "f"({info.get('disk', {}).get('percent', 0):.1f}%)")self.upload_label.setText(f"Upload: {info.get('network', {}).get('upload_mbps', 0):.2f} MB/s")self.download_label.setText(f"Download: {info.get('network', {}).get('download_mbps', 0):.2f} MB/s")gpu_text = "GPU: N/A"if info.get("gpu"):gpu = info["gpu"][0]gpu_text = (f"GPU {gpu['gpu_id']}: Utilization {gpu['utilization_percent']}%"f", Memory {gpu['memory_used_mb']:.1f}/"f"{gpu['memory_total_mb']:.1f} MB "f"({gpu['memory_percent']:.1f}%)")self.gpu_label.setText(gpu_text)# 更新曲线图,使用 time_elapsed % 60 保持 X 轴 0-60x_value = self.time_elapsedif self.time_elapsed == 61:self.time_elapsed = 60self.cpu_series.append(x_value, info.get('cpu_usage_percent', 0))self.memory_series.append(x_value, info.get('memory', {}).get('percent', 0))self.disk_series.append(x_value, info.get('disk', {}).get('percent', 0))self.upload_series.append(x_value, info.get('network', {}).get('upload_mbps', 0))self.download_series.append(x_value, info.get('network', {}).get('download_mbps', 0))gpu_percent = info.get('gpu', [{}])[0].get('utilization_percent', 0) if info.get('gpu') else 0self.gpu_series.append(x_value, gpu_percent)for series in [self.cpu_series, self.memory_series, self.disk_series,self.upload_series, self.download_series, self.gpu_series]:points = series.points()if len(points) > 60:series.remove(0)# points所有x坐标减1for point in points:point.setX(point.x() - 1)series.replace(points)if __name__ == "__main__":import sysapp = QApplication(sys.argv)window = SystemMonitorWindow()window.show()app.exec()

效果:
在这里插入图片描述

设计亮点

  1. 单例模式:通过 __new__ 和线程锁确保全局唯一实例,适合多线程环境。
  2. 自动监控:初始化后立即启动后台线程,持续更新数据,无需手动控制。
  3. 线程安全:使用锁保护共享数据,外部读取安全。
  4. 灵活扩展:可轻松添加新监控指标或集成远程数据传输(如 ZeroMQ)。

注意事项

  • GPU 监控:需要 NVIDIA 显卡和驱动,否则跳过 GPU 数据。
  • 磁盘路径:默认监控根分区(/),Windows 用户可改为 C:\\
  • 性能:采集间隔(默认 1 秒)可根据需求调整,避免过高频率影响性能。

扩展方向

  • 远程监控:通过 API(如 Flask)或消息队列(如 ZeroMQ)发送数据。
  • 告警系统:当资源超阈值时触发通知。
  • 可视化:使用 Matplotlib 或 Grafana 展示实时图表。

总结

SystemMonitor 提供了一个简单而强大的解决方案,用于监控系统资源。它结合单例模式、持续运行和线程安全的数据存储,适合从简单脚本到复杂分布式系统的各种场景。欢迎尝试并根据需求扩展!

相关文章:

使用 Python 监控系统资源

使用 Python 监控系统资源 在开发分布式系统或性能敏感的应用时,实时监控系统资源(如 CPU、内存、磁盘、网络和 GPU 使用率)至关重要。本文介绍一个基于 Python 的 SystemMonitor 类,它以单例模式持续采集系统资源信息&#xff0…...

【Qt4】Qt4中实现PDF预览

方案一: 在Qt4中预览PDF文件,你可以使用多种方法,但最常见和简单的方法之一是使用第三方库。Qt本身并没有内置直接支持PDF预览的功能,但你可以通过集成如Poppler、MuPDF等库来实现这一功能。下面我将展示如何使用Poppler库在Qt4中…...

从试错到智能决策:Python与强化学习优化自动驾驶策略

从试错到智能决策:Python与强化学习优化自动驾驶策略 一、引言:自动驾驶如何更聪明? 自动驾驶技术的发展,已经从简单的感知与规则控制,迈向更加智能化的强化学习(Reinforcement Learning,RL)决策优化时代。过去,自动驾驶更多依赖 传统算法(如A、Dijkstra路径规划)…...

【免费下载】全国范围的城市用地类型数据

该数据以路网及水系切分得到的交通小区为最小地块,并基于卫星影像、夜间灯光数据、POI数据、手机信令数据对地块进行分类。 需要这份数据,请在文末查看下载方法。 一、数据介绍 该数据的用地类型可分为居住用地、商务办公用地、商业服务用地、工业用地…...

小程序问题(记录版)

1、样式不生效 在h5上生效 但是 小程序上没反应 解决办法:解除组件样式隔离 1、isolated 表示启用样式隔离,在自定义组件内外,使用 class 指定的样式将不会相互影响(一般情况下的默认值) 2、apply-shared 表示页面 wxs…...

STL之stackqueue

stack的介绍(可以想象成栈) 1.stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作 2.stack是作为容器适配器被实现的,容器适配器即是对特点类封装作为其…...

学习海康VisionMaster之间距检测

一:进一步学习了 今天学习下VisionMaster中的间距检测工具:主要类似于卡尺工具,测量物体的长度或者宽度或者间距 二:开始学习 1:什么是间距检测? 间距测量模块用于检测两特征边缘之间的间距,首…...

【SpringBoot教程】SpringBoot自定义注解与AOP实现切面日志

🙋大家好!我是毛毛张! 🌈个人首页: 神马都会亿点点的毛毛张 文章目录 1.前言2.SpringAOP实现切面日志快速入门1.1 创建SpringBoot项目1.2 依赖配置pom.xml1.3 自定义日志注解1.4 配置 AOP 切面1.5 怎么使用呢?1.6 实…...

C++学习之路,从0到精通的征途:stack_queue的模拟实现及deque原理介绍

目录 一.容器适配器 1.什么是适配器 2.STL标准库中stack和queue的底层结构 3.deque的原理介绍 deque是如何借助其迭代器维护其假想连续的结构呢? 头插 尾插 遍历 4.deque的优缺点 二.stack的模拟实现 三.queue的模拟实现 一.容器适配器 1.什么是适配…...

文件上传漏洞篇:upload-labs靶场搭建

一、文件上传漏洞简述 文件上传漏洞是一种常见的Web安全漏洞,当网站或应用程序允许用户上传文件(如图片、文档等)时,若未对上传的文件进行充分的安全检查,攻击者可能利用此漏洞上传恶意文件(如Web Shell、…...

TikTok 矩阵账号运营实操细节:打造爆款矩阵

在 TikTok 的流量版图里,打造 TikTok 矩阵账号能显著提升影响力与吸粉能力。而借助 AI 工具,更可为 TikTok 矩阵运营效率的提升赋能,让运营如虎添翼。下面就为大家详细讲讲其中的实操细节,并结合一些伪代码示例辅助理解。 一、矩…...

Nginx安全防护与HTTPS部署实战

一.核心安全配置 1.编译安装Nginx (1)安装支持软件 Nginx的配置及运行需要pcre、zlib等软件包的支持,因此应预先安装这些软件的开发包(devel),以便提供相应的库和头文件,确保Nginx的安装顺利…...

【C语言】初阶数据结构相关习题(一)

🎆个人主页:夜晚中的人海 今日语录:人的生命似洪水在奔流,不遇着岛屿、暗礁,难以激起美丽的浪花。——奥斯特洛夫斯基 文章目录 ⭐一、判定是否互为字符重排🎉二、 回文排列🚀三、字符串压缩&am…...

MySQL从入门到精通(一):MySQL介绍及数据库相关概念

目录 一、MySQL 介绍 二、数据库相关概念 (一)数据库基础知识 (二)主流的关系型数据库管理系统 三、关系型数据库与非关系型数据库 (一)定义 (二)数据模型对比 (…...

宁德时代区块链+数字孪生专利解析:去中心化身份认证重构产业安全底座

引言:当动力电池巨头瞄准数字孪生安全 2025年5月6日,金融界披露宁德时代未来能源(上海)研究院与母公司宁德时代新能源科技股份有限公司联合申请的一项关键专利——“身份验证方法、系统、电子设备及存储介质”。这项技术将区块链…...

Kotlin数据类在Android开发中的应用

在 Android 开发中,Kotlin 的数据类(Data Class)因其简洁性和自动生成的功能特性,成为了提升开发效率的利器。以下是我总结的 7 大核心妙用场景,配合代码示例助您快速掌握: 1️⃣ JSON 解析利器 → 网络请求模型 与 Retrofit/Moshi 完美配合,自动生成 equals()/hashCod…...

程序员学商务英语之Shipment Claim 运输和索赔

Dia-3: Claim 1 索赔 1. He claimed that he would quit smoking. 他宣布他将要禁烟。 2. BYD is inferior to Tesla. 差 be worse than… 比亚迪比特斯拉差。 Tesla is superior to BYD. 特斯拉比比亚迪好。 be better than… 3. The survey report reveals/s…...

Kotlin密封类优化Android状态管理

Kotlin 的密封类(Sealed Class)确实是 Android 开发中管理复杂 UI 状态的利器。它通过类型安全的层次结构,让状态管理代码更加清晰简洁。让我们从实际开发场景出发,深入探讨其应用: 一、密封类核心优势 受限的类继承…...

基于图像处理的道路监控与路面障碍检测系统设计与实现 (源码+定制+开发) 图像处理 计算机视觉 道路监控系统 视频帧分析 道路安全监控 城市道路管理

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...

依赖注入详解与案例(前端篇)

依赖注入详解与案例(前端篇) 一、依赖注入核心概念与前端价值 依赖注入(Dependency Injection, DI) 是一种通过外部容器管理组件/类间依赖关系的设计模式,其核心是控制反转(Inversion of Control, IoC&…...

Spark 的 Shuffle 机制:原理与源码详解

Apache Spark 是一个分布式数据处理框架,专为大规模数据分析设计。其核心操作之一是 Shuffle,这是一个关键但复杂的机制,用于在某些操作期间在集群中重新分配数据。理解 Shuffle 需要深入探讨其目的、机制和实现,既包括概念层面&a…...

IdeaVim配置指南

一、什么是 IdeaVim? IdeaVim 是 JetBrains 系列 IDE(如 IntelliJ IDEA, WebStorm, PyCharm 等)中的一个插件,让你在 IDE 里使用 Vim 的按键习惯,大大提升效率。 安装方法: 在 IDE 中打开 设置(Settings) →…...

[监控看板]Grafana+Prometheus+Exporter监控疑难排查

采用GrafanaPrometheusExporter监控MySQL时发现经常数据不即时同步,本示例也是本地搭建采用。 Prometheus面板 1,Detected a time difference of 11h 47m 22.337s between your browser and the server. You may see unexpected time-shifted query res…...

P56-P60 统一委托,关联游戏UI,UI动画,延迟血条

这一部分首先把复杂的每个属性委托全部换成了简洁可复用的委托,之后重新修改了UI蓝图,然后在新增了一个与之前表格关联的动画与血条延迟下降的蓝图 OverlayAuraWidgetController.h // Fill out your copyright notice in the Description page of Project Settings. #pragma …...

智能修复大模型生成的 JSON 字符串:Python 实现与优化

在使用大语言模型(LLM)生成 JSON 格式数据时,常因模型输出不完整、语法错误或格式不规范导致 JSON 解析失败。本文介绍如何通过 json_repair 库实现对 LLM 生成 JSON 字符串的自动修复,并改进原始提取函数以提升容错能力。 一、LLM 生成 JSON 的常见问题 LLM 输出的 JSON …...

【PPT制作利器】DeepSeek + Kimi生成一个初始的PPT文件

如何基于DeepSeek Kimi进行PPT制作 步骤: Step1:基于DeepSeek生成文本,提问 Step2基于生成的文本,用Kimi中PPT助手一键生成PPT 进行PPT渲染-自动渲染 可选择更改模版 生成PPT在桌面 介绍的比较详细,就是这个PPT模版…...

华为设备端口隔离

端口隔离的理论与配置指南 一、端口隔离的理论 基本概念 端口隔离(Port Isolation)是一种在交换机上实现的安全功能,用于限制同一VLAN内指定端口间的二层通信。被隔离的端口之间无法直接通信,但可通过上行端口访问公共资源&#…...

YOLO12改进-C3K2模块改进-引入离散余弦变换DCT 减少噪声提取图像的细节、边缘和纹理等微观特征

离散余弦变换(Discrete Cosine Transform, DCT)由 Nasir Ahmed 于 1974 年提出,最初是为了优化数据压缩。其核心思想是将信号从空间域转换为频率域,从而实现冗余信息的压缩。DCT 在图像和视频处理领域应用广泛,例如 JP…...

基于大模型的自然临产阴道分娩全流程预测与方案研究报告

目录 一、引言 1.1 研究背景与目的 1.2 研究意义 1.3 国内外研究现状 二、大模型技术原理与应用概述 2.1 大模型基本原理 2.2 在医疗领域的应用现状 2.3 用于分娩预测的优势 三、术前预测与准备方案 3.1 产妇身体状况评估指标 3.2 大模型预测流程与方法 3.3 基于预…...

用 Tailwind CSS 优化你的 Vue 3 项目! ! !

Vue 3 的响应式魅力 TailwindCSS 的原子级美学 前端开发的舒适巅峰! 在现代前端开发中,组件驱动 原子化 CSS 正在成为新的标准。如果你已经在使用 Vue 3,那不妨试试 Tailwind CSS —— 一个强大的原子化 CSS 框架,它能让你几乎…...

PostgreSQL数据库的array类型

PostgreSQL数据库相比其它数据库,有很多独有的字段类型。 比如array类型,以下表的pay_by_quarter与schedule两个字段便是array类型,即数组类型。 CREATE TABLE sal_emp (name text,pay_by_quarter integer[],schedule t…...

融智学视角集大成范式革命:文理工三类AI与网络大数据的赋能

融智学视角下的“集大成”范式革命:AI与大数据的终极赋能 一、化繁为简的工具革命:AI与大数据的三重解构 信息压缩的数学本质 Kolmogorov复杂度极限突破: K_AI(x)min_p∈P_NN ℓ(p)λ⋅dist(U(p),x) (神经网络程序p的描述长度语…...

【2025】Visio 2024安装教程保姆级一键安装教程(附安装包)

前言 大家好!最近很多朋友在问我关于Visio 2024的安装问题,尤其是对于那些需要制作专业流程图和组织结构图的小伙伴来说,这款软件简直是必不可少的办公神器!今天就给大家带来这篇超详细保姆级的Visio 2024安装教程,不…...

C++【继承】

继承 1.继承1.1 继承的概念1.2继承的定义1.2.1定义格式1.2.2继承基类成员访问方式的变化 1.3继承模板 2.基类和派生类之间的转换 1.继承 1.1 继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许我们在保持原有类特性的基础上…...

理解字、半字与字节 | 从 CPU 架构到编程实践的数据类型解析

注:本文为 “字、半字、字节” 相关文章合辑。 略作重排,未全校。 如有内容异常,请看原文。 理解计算机体系结构中的字、半字与字节 在计算机科学中,理解“字 (Word)”、“半字 (Half-Word)”和“字节 (Byte)”等基本数据单元的…...

VMware搭建ubuntu保姆级教程

目录 VMware Ubuntu 虚拟机配置指南 创建虚拟机 下载 Ubuntu ISO 新建虚拟机 网络配置(双网卡模式) 共享文件夹设置 SSH 远程访问配置 VMware Ubuntu 虚拟机配置指南 创建虚拟机 下载 Ubuntu ISO 【可添加我获取】 官网:Get Ubunt…...

内容社区系统开发文档

1 系统分析 1.1 项目背景 1.2 需求分析 2 系统设计 2.1 系统功能设计 2.2 数据库设计 2.2.1 数据库需求分析 2.2.2 数据库概念结构设计 2.2.3 数据库逻辑结构设计 2.2.4 数据库物理结构设计 2.2.5 数据库视图设计 2.2.6 函数设计 2.2.7 存储过程设计 2.2.8 触发器…...

Ubuntu开放端口

在 Ubuntu 中,我们可以使用 ufw (Uncomplicated Firewall) 来管理防火墙。以下是打开 80 和 8090 端口的步骤: 首先检查防火墙状态 sudo ufw status 如果防火墙没有启用,先启用它: sudo ufw enable 允许 80 端口(…...

PyTorch 与 TensorFlow 中基于自定义层的 DNN 实现对比

深度学习双雄对决:PyTorch vs TensorFlow 自定义层大比拼 目录 深度学习双雄对决:PyTorch vs TensorFlow 自定义层大比拼一、TensorFlow 实现 DNN1. 核心逻辑 二、PyTorch 实现自定义层1. 核心逻辑 三、关键差异对比四、总结 一、TensorFlow 实现 DNN 1…...

质量员考试案例题有哪些常见考点?

质量员考试案例题常见考点如下: 施工质量控制 施工工艺与工序:如混凝土浇筑时的振捣时间、方法,若振捣不充分会导致混凝土出现蜂窝、麻面等质量问题。 施工环境:例如在高温天气下进行砌筑作业,未对砌块进行适当处理或…...

Axure疑难杂症:深度理解与认识“事件”“动作”(玩转交互)

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:深度理解与认识“事件”“动作” 主要内容:事件、动作定义、本质、辩证关系、执行顺序 应用场景:原型交互 …...

【AI知识库云研发部署】RAGFlow + DeepSeek

gpu 安装screen:yum install screen 配置ollama: 下载官方安装脚本并执行: curl -fsSL https://ollama.com/install.sh | sh 通过screen后台运行ollama:screen -S ollama 在screen会话中启动服务: export OLLA…...

HTML07:表格标签

表格 基本结构 单元格行列跨行跨列 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>表格学习</title><style>td {text-align: center;vertical-align: middle;}</style> </he…...

【专家库】Kuntal Chowdhury

昆塔尔乔杜里 Kuntal Chowdhury 是 NVIDIA 的 6G 开发者关系经理和技术布道师。他致力于推动与 NVIDIA 平台和工具的开发者和早期采用者生态系统的联系&#xff0c;以促进 6G 研究社区的蓬勃发展。在此之前&#xff0c;他是 BlueFusion, Inc. 的创始人&#xff0c;这是一家创新…...

IAA-Net:一种实孔径扫描雷达迭代自适应角超分辨成像方法——论文阅读

IAA-Net:一种实孔径扫描雷达迭代自适应角超分辨成像方法 1. 论文的研究目标与实际意义1.1 研究目标1.2 实际问题与产业意义2. 论文的创新方法、公式与优势2.1 方法框架与核心步骤2.2 核心公式与推导2.2.1 回波模型与目标函数2.2.2 正则化加权矩阵设计2.2.3 迭代更新公式2.2.4 …...

[论文阅读]MCP Guardian: A Security-First Layer for Safeguarding MCP-Based AI System

MCP Guardian: A Security-First Layer for Safeguarding MCP-Based AI System http://arxiv.org/abs/2504.12757 推出了 MCP Guardian&#xff0c;这是一个框架&#xff0c;通过身份验证、速率限制、日志记录、跟踪和 Web 应用程序防火墙 &#xff08;WAF&#xff09; 扫描来…...

提示词工程:通向AGI时代的人机交互艺术

‌引言&#xff1a;从基础到精通的提示词学习之旅‌ 欢迎来到 ‌"AGI时代核心技能"‌ 系列课程的第二模块——‌提示词工程‌。在这个模块中&#xff0c;我们将系统性地探索如何通过精心设计的提示词&#xff0c;释放大型语言模型的全部潜力&#xff0c;实现高效、精…...

地级市-机器人、人工智能等未来产业水平(2009-2023年)-社科数据

地级市-机器人、人工智能等未来产业水平&#xff08;2009-2023年&#xff09;-社科数据https://download.csdn.net/download/paofuluolijiang/90623814 https://download.csdn.net/download/paofuluolijiang/90623814 此数据集统计了2009-2023年全国地级市在机器人、人工智能等…...

神经网络中之多类别分类:从基础到高级应用

神经网络中之多类别分类&#xff1a;从基础到高级应用 摘要 在机器学习领域&#xff0c;多类别分类是解决复杂问题的关键技术之一。本文深入探讨了神经网络在多类别分类中的应用&#xff0c;从基础的二元分类扩展到一对多和一对一分类方法。我们详细介绍了 softmax 函数的原理…...

破解工业3D可视化困局,HOOPS Visualize助力高效跨平台协作与交互!

一、当前3D可视化面临的痛点 &#xff08;1&#xff09;性能瓶颈 现有的许多3D可视化工具在处理大型复杂模型时往往力不从心。例如在航空航天、汽车制造等高端制造业&#xff0c;动辄涉及数以亿计的三角面片和海量的纹理细节。这些超大规模的模型在渲染时常常出现卡顿、延迟&…...