需求:需要提供一个API接收json数据,然后写入excel,写入的同时需要启一个线程实时监控系统内存情况。
坑:结果发现,在实际运行中,资源监视器上的数据和监控线程跑的数据是不一致的。
代码如下:
def monitor_memory(p,q):
mem = psutil.virtual_memory()
while True:
# 系统总计内存
zj = float(mem.total) / 1024 / 1024 / 1024
print('total:',round(zj,2),'G')
# 系统已经使用内存
ysy = float(mem.used) / 1024 / 1024 / 1024
print('used:',round(ysy,2),'G')
act = float(mem.free) / 1024 / 1024 / 1024
print('free:', round(act, 2), 'G')
# # 系统空闲内存
# kx = float(mem.free) / 1024 / 1024 / 1024
print('mem ratio:',round(ysy/zj,2))
if ysy/zj>0.91:
q.put('##')
p.kill()
time.sleep(1)
改进方案:
因为启用一个子进程实现数据写入
from multiprocessing import Process,Queue
p=Process(target=write_data)
p.start()
t=Thread(target=monitor,arg=(p,))
t.start()
实时监控该进程使用内存:
def monitor_memory(p,q):
mem = psutil.virtual_memory()
while True:
# 系统总计内存
zj = float(mem.total) / 1024 / 1024 / 1024
print('total:',round(zj,2),'G')
# 系统已经使用内存
ysy = float(mem.used) / 1024 / 1024 / 1024
print('used:',round(ysy,2),'G')
# recent process memory
try:
#进程使用内存
act = float(psutil.Process(p.pid).memory_info().rss) / 1024 / 1024 / 1024
print(p.pid,'_memory:', round(act, 2), 'G')
except Exception as e:
print(e)
sys.exit()
捕获异常是因为当数据写入完成后,进程消失。此时再去获取p.pid就会报错。其实这是很奈斯的退出信号。