实现目的:
限制python程序对内存的占用,避免因占用过高,被系统杀死
背景
1.多线程生产数据,单线程消费数据,因生产数据速度远远大于消费速度,出现数据堆积,占用大量内存,被系统杀死
2.我这里的思路是设置一个内存阀值,
当大于这个内存阀值时,生产者线程设置为1,
小于这个内存阀值时,恢复默认线程,
每10s检测一下,内存占用情况,动态调整生产者的线程
出现的原因
1.由于生产者与消费者的不协调关系,生产者生产过多数据,无法消费,堆积在内存中
2.while True等死循环的使用
3.开发规范中存在问题
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time : 2022/10/10 18:28
# @Author : jia666666
# @FileName: 内存测试.py
import time
import os
import psutil
import queue
Memory_Limit=0.1 #内存阀值,单位GB
sign=False
class Memory_thd():
"""内存-生产者线程管理"""
def __init__(self, thd):
"""初始化"""
self.starttime = time.time() # 开始时间
self.thd = thd # 线程数
def get_current_memory_gb(self):
"""获取当前进程内存占用"""
pid = os.getpid() # 获取当前进程pid
p = psutil.Process(pid)
info = p.memory_full_info()
return info.uss / 1024. / 1024. / 1024. # 返回内存占用大小,单位GB
def return_thd_num(self):
"""比较内存阀值后,返回生产者线程数"""
print(f'当前内存占用{self.get_current_memory_gb()}')
if self.get_current_memory_gb() > Memory_Limit: # 内存大小占用大于阀值
return False
else:
return self.thd
def main(self):
"""主逻辑"""
end = time.time() # 当前时间
if end - self.starttime > 10: # 每10s检测一次
self.starttime = end
return self.return_thd_num()
else:
return self.thd
data_que=queue.Queue()
sa = Memory_thd(True)
print('内存填充')
while True:
data_que.put('1111111111111')
if not sa.main():#内存达到限定阀值,退出
break
print('内存释放')
while not data_que.empty():
key=data_que.get()
sa.main()
"""
python进程内存阀值控制
内存填充
当前内存占用0.0720367431640625
当前内存占用0.11545181274414062
内存释放
当前内存占用0.0824127197265625
当前内存占用0.047466278076171875
"""