本文目录导读:

基础统计方法
import time
import threading
from collections import deque
import numpy as np
class SyncTaskMonitor:
def __init__(self):
self.task_times = [] # 存储所有任务耗时
self.lock = threading.Lock()
def measure_task(self, task_func, *args, **kwargs):
"""测量单个任务耗时"""
start_time = time.time()
result = task_func(*args, **kwargs)
end_time = time.time()
duration = end_time - start_time
with self.lock:
self.task_times.append(duration)
return result, duration
def get_peak_stats(self):
"""获取峰值统计"""
with self.lock:
if not self.task_times:
return None
times = np.array(self.task_times)
return {
'max': np.max(times),
'min': np.min(times),
'average': np.mean(times),
'median': np.median(times),
'std': np.std(times),
'p95': np.percentile(times, 95),
'p99': np.percentile(times, 99),
'count': len(times)
}
滑动窗口统计峰值
class SlidingWindowPeakMonitor:
def __init__(self, window_size=100):
self.window = deque(maxlen=window_size)
self.peak_values = []
self.lock = threading.Lock()
def add_measurement(self, duration):
"""添加新的耗时数据"""
with self.lock:
self.window.append(duration)
# 计算当前窗口的峰值
if len(self.window) > 1:
current_peak = max(self.window)
self.peak_values.append({
'timestamp': time.time(),
'peak': current_peak,
'window_avg': np.mean(self.window),
'current_duration': duration
})
def get_peak_summary(self):
"""获取峰值摘要"""
with self.lock:
if not self.peak_values:
return None
peaks = [p['peak'] for p in self.peak_values]
return {
'all_time_peak': max(peaks),
'recent_peak': self.peak_values[-1]['peak'] if self.peak_values else 0,
'average_peak': np.mean(peaks),
'peak_times': len([p for p in peaks if p > np.mean(peaks) * 1.5])
}
实时监控装饰器
import functools
import logging
def monitor_sync_task(name=None, threshold=5.0):
"""监控同步任务的装饰器"""
monitor = SyncTaskMonitor()
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
task_name = name or func.__name__
start_time = time.time()
try:
result = func(*args, **kwargs)
duration = time.time() - start_time
# 记录耗时
monitor.task_times.append(duration)
# 检查是否超过阈值
if duration > threshold:
logging.warning(f"Task '{task_name}' took {duration:.2f}s (threshold: {threshold}s)")
# 检查是否达到峰值
current_peak = max(monitor.task_times[-50:]) if len(monitor.task_times) >= 50 else max(monitor.task_times)
if duration >= current_peak * 0.9:
logging.info(f"Task '{task_name}' near peak: {duration:.2f}s")
return result
except Exception as e:
duration = time.time() - start_time
logging.error(f"Task '{task_name}' failed after {duration:.2f}s: {e}")
raise
wrapper.monitor = monitor
return wrapper
return decorator
使用示例
# 示例1:基本用法
monitor = SyncTaskMonitor()
# 模拟同步任务
def sync_task(task_id, delay=1):
time.sleep(delay)
return f"Task {task_id} completed"
# 执行任务并测量
for i in range(10):
result, duration = monitor.measure_task(sync_task, i, delay=0.5 + np.random.random())
print(f"Task {i}: {duration:.2f}s")
# 获取统计
stats = monitor.get_peak_stats()
print(f"峰值耗时: {stats['max']:.2f}s")
print(f"平均耗时: {stats['average']:.2f}s")
print(f"P95耗时: {stats['p95']:.2f}s")
# 示例2:使用装饰器
@monitor_sync_task(name="data_sync", threshold=3.0)
def data_sync():
time.sleep(2 + np.random.random() * 2)
return "Data synced"
# 多次执行
for _ in range(5):
data_sync()
# 查看统计
peak_info = data_sync.monitor.get_peak_stats()
print(f"任务耗时峰值: {peak_info['max']:.2f}s")
可视化峰值
import matplotlib.pyplot as plt
def plot_peak_distribution(task_times):
"""绘制峰值分布"""
times = np.array(task_times)
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4))
# 耗时分布
ax1.hist(times, bins=30, alpha=0.7)
ax1.axvline(np.max(times), color='r', linestyle='--', label=f'Peak: {np.max(times):.2f}s')
ax1.axvline(np.mean(times), color='g', linestyle='--', label=f'Avg: {np.mean(times):.2f}s')
ax1.set_xlabel('Duration (s)')
ax1.set_ylabel('Frequency')
ax1.legend()
ax1.set_title('Task Duration Distribution')
# 时间序列
ax2.plot(times, 'b-', alpha=0.6)
ax2.axhline(np.max(times), color='r', linestyle='--', label='Peak')
ax2.axhline(np.mean(times), color='g', linestyle='--', label='Average')
ax2.set_xlabel('Task Number')
ax2.set_ylabel('Duration (s)')
ax2.legend()
ax2.set_title('Task Duration Timeline')
plt.tight_layout()
plt.show()
高级峰值分析
class AdvancedPeakAnalyzer:
def __init__(self, data):
self.data = np.array(data)
def find_peak_windows(self, window_size=10):
"""找出峰值窗口"""
peaks = []
for i in range(len(self.data) - window_size + 1):
window = self.data[i:i+window_size]
peaks.append({
'start_idx': i,
'end_idx': i + window_size,
'peak': np.max(window),
'mean': np.mean(window)
})
return peaks
def detect_anomalies(self, threshold=2):
"""检测异常峰值"""
mean = np.mean(self.data)
std = np.std(self.data)
anomalies = []
for i, val in enumerate(self.data):
if abs(val - mean) > threshold * std:
anomalies.append({
'index': i,
'value': val,
'z_score': (val - mean) / std
})
return anomalies
这些方法可以帮助你:
- 实时监控任务耗时
- 计算各种统计指标(最大值、P95、P99等)
- 检测异常峰值
- 可视化分析结果
- 设置告警阈值
根据你的具体需求选择合适的实现方式。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播