实现目的:

限制python程序对内存的占用,避免因占用过高,被系统杀死

背景

1.多线程生产数据,单线程消费数据,因生产数据速度远远大于消费速度,出现数据堆积,占用大量内存,被系统杀死
2.我这里的思路是设置一个内存阀值,
当大于这个内存阀值时,生产者线程设置为1,
小于这个内存阀值时,恢复默认线程,
每10s检测一下,内存占用情况,动态调整生产者的线程

python 控制内存 python内存设置_linux

出现的原因

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
"""