记录psutil的一个小坑,实时监控进程内存/关闭监控线程

需求:需要提供一个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就会报错。其实这是很奈斯的退出信号。

感谢
python psutil库

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值