多进程多函数场景下加密算法性能测量的PID获取与优化
问题分析与解决方案
原代码核心问题
- 多进程调用错误:
target=Encryption()会直接在主进程执行函数,而非子进程,导致PID传递完全失效 - 多进程全局变量不共享:
pid和running无法跨进程同步状态 - 函数调用错误:
metric_collector未定义,实际应为cpuUsage - 语法错误:
running=true应为Python布尔值running=True - timeit逻辑缺陷:未定义的加密函数参数(
a,b,d)、外部变量注入方式错误,额外代码干扰性能测量
简洁可行的实现方案
采用线程替代进程做监控(线程开销远低于进程,且共享内存,无需复杂状态同步),同时确保timeit仅测量加密解密核心逻辑,最小化额外开销:
import sys import random import timeit import psutil import os import time from threading import Thread def cpu_monitor(pid): """后台监控进程的CPU和内存占用""" p = psutil.Process(pid) while True: try: mem_usage = p.memory_info().rss / (1024 * 1024) cpu_percent = p.cpu_percent(interval=1) print(f'PID: {pid}\t|\tCPU Usage: {cpu_percent}%\t|\tMemory Usage: {mem_usage:.2f} MB') except psutil.NoSuchProcess: # 目标进程结束时自动停止监控 break def encryption_benchmark(): pid = os.getpid() # 启动后台监控线程(daemon=True:主进程结束时自动终止) monitor_thread = Thread(target=cpu_monitor, args=(pid,), daemon=True) monitor_thread.start() # 生成测试数据集 myList = [random.randint(-sys.maxsize, sys.maxsize) + random.random() for _ in range(1000)] # 替换为你实际的加密函数参数 a, b, d = 1, 2, 3 print('Now running timeit function for speed metrics.') number = 1000 # 正确注入timeit所需的变量和依赖 setup = f''' import homomorphic myList = {myList!r} a = {a!r} b = {b!r} d = {d!r} ''' enc_code = ''' for idx in range(len(myList)): myList[idx] = homomorphic.encryptMethod(a, b, myList[idx], d) ''' dec_code = ''' for idx in range(len(myList)): myList[idx] = homomorphic.decryptMethod(myList[idx]) ''' # 仅测量加密+解密的核心逻辑时间 total_time = timeit.timeit(setup=setup, stmt=enc_code + dec_code, number=number) # 输出性能指标 avg_time_per_iter = total_time / number total_ops = number * len(myList) print(f''' Average Time per Iteration:\t {avg_time_per_iter:.6f} seconds Total Time for {number} Iters:\t {total_time:.2f} seconds Total Encrypted/Decrypted Values:\t {total_ops} ''') if __name__ == '__main__': print('Beginning Metric Evaluation\n...\n') encryption_benchmark()
关键优化点
- 线程监控替代进程:避免多进程的内存隔离问题,直接传递当前进程PID即可,开销极低
- 精准性能测量:timeit仅执行加密解密逻辑,监控线程的后台操作不会干扰计时结果
- 自动状态管理:监控线程设为守护线程,主进程结束时自动停止,无需手动维护
running信号 - 变量正确注入:用
f-string格式化timeit的setup代码,确保测试数据和参数正确传入计时环境
内容的提问来源于stack exchange,提问作者lostInSpace
相关产品推荐
相关产品推荐

