python程序中断然后接着中断代码继续运行

前言:
python通过django,flask框架开发运维管理的时候,碰到的一个功能可能涉及很多个模块,里面涉及了多个表数据,如果前面的运行都很不错,但是中间一旦报错了,这就很烦,程序退出了,需要重新再来一遍,数据也需要重新清洗。
如果有一个很好的选择可以让程序在在有问题的模块部位中止,主进程一直不退出继续保持运行状态,处理好有问题的模块之后运行下面没问题的模块即可

import  time
import psutil
import datetime,os
pause=psutil.Process(os.getpid())
from jielong import GoodMessage
msg=None
try:
	print("程序启动时间:",datetime.datetime.now())
    g=GoodMessage('狗',10)
    with open('drink.txt','w+',encoding='gbk') as f:
        msg=g.drink(20)
        f.write(msg)
except Exception as e:
    print("程序出异常了所以需要暂停当前进程ID是:{}".format(os.getpid()))
    pause.suspend()
with open('drink.txt','r+') as f:
    msg=f.read()
for i in range(5):
    print(f"执行时间是{datetime.datetime.now()}")
    print(msg)
    time.sleep(2)

运行结果

程序启动时间: 2022-05-26 11:08:03.661051
执行时间是2022-05-26 11:08:03.663050
动物都要喝水,狗每次喝10L水
执行时间是2022-05-26 11:08:05.667317
动物都要喝水,狗每次喝10L水
执行时间是2022-05-26 11:08:07.671946
动物都要喝水,狗每次喝10L水
执行时间是2022-05-26 11:08:09.677413
动物都要喝水,狗每次喝10L水
执行时间是2022-05-26 11:08:11.686922
动物都要喝水,狗每次喝10L水

jielong.py

class GoodMessage(object):
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def drink(self,vol):
        return "动物都要喝水,{}每次喝{}L水".format(self.name,10)

下面模拟jielong模块出错的问题

import  time
import psutil
import datetime,os
pause=psutil.Process(os.getpid())
from jielong import GoodMessage
msg=None
try:
	print("程序启动时间:",datetime.datetime.now())
    g=GoodMessage('狗',10)
    with open('drink.txt','w+',encoding='gbk') as f:
        msg=g.drink()
        f.write(msg)
except Exception as e:
    print("程序出异常了所以需要暂停当前进程ID是:{}".format(os.getpid()))
    pause.suspend()
with open('drink.txt','r+') as f:
    msg=f.read()
for i in range(5):
    print(f"执行时间是{datetime.datetime.now()}")
    print(msg)
    time.sleep(2)

在这里插入图片描述

可以看出程序已经hang住了

此时的drink.txt文件也已经为空了,这里可以把drink.txt当作保存处理结果的一个文档,因为异常了我们手动处理下这个文档,给这个里面加上如果程序没有异常正常返回的结果,生产环境可能是数据库保存这些数据,然后在读取
上面的进程ID是9016
我们可以在cmd窗口直接连接到这个进程,然后让程序启动起来
在这里插入图片描述

执行结果

程序启动时间: 2022-05-26 11:15:53.337709
程序出异常了所以需要暂停当前进程ID是:2868
执行时间是2022-05-26 11:17:39.144744
动物都要喝水,狗每次喝10L水
执行时间是2022-05-26 11:17:41.154257
动物都要喝水,狗每次喝10L水
执行时间是2022-05-26 11:17:43.167452
动物都要喝水,狗每次喝10L水
执行时间是2022-05-26 11:17:45.173947
动物都要喝水,狗每次喝10L水
执行时间是2022-05-26 11:17:47.183822
动物都要喝水,狗每次喝10L水

Process finished with exit code 0

可以看出来中断的程序的确可以继续运行下去

### GPU深度学习训练中断恢复方法 对于GPU深度学习训练过程中断后的继续问题,可以采取多种策略来实现有效的断点续训配置。一种常见的方式是在模型保存和加载机制上进行优化。 为了防止意外中断造成的数据丢失,在每次迭代结束时定期保存模型的状态以及当前的参数集是一个有效的方法[^1]。这通常涉及到设置检查点(checkpoint),即每当完成一定数量的epoch或者batch之后就自动存储一次完整的网络权重和其他必要的元数据到磁盘文件中去。当程序重新启动时可以从最近的一个checkpoint位置读取这些信息并从中断处开始新的训练过程而不是从头再来一遍。 另外值得注意的是租用云服务提供商所提供的按需实例可能随时会被回收掉从而导致正在运行的任务被强制终止;因此建议选择那些提供预付费预留资源选项的服务商,并且确保所使用的框架支持分布式训练以便于跨多台机器部署应用程序以提高稳定性与可靠性。 最后一点就是利用一些高级库比如PyTorch Lightning或TensorFlow Estimator API内置的功能简化这一流程,它们内部已经实现了较为完善的故障转移逻辑可以帮助开发者更轻松地处理这类情况。 ```python import torch from torch import nn, optim class Model(nn.Module): def __init__(self): super(Model, self).__init__() # 定义模型结构... def train(model: nn.Module, optimizer: optim.Optimizer, start_epoch=0, epochs=100): checkpoint_path = 'model_checkpoint.pth' try: for epoch in range(start_epoch, epochs): # 训练代码... if (epoch + 1) % 10 == 0: state = { 'epoch': epoch, 'state_dict': model.state_dict(), 'optimizer' : optimizer.state_dict() } torch.save(state, checkpoint_path) except Exception as e: print(f'Training interrupted by {e}') if not os.path.exists('model_checkpoint.pth'): model = Model().cuda() optimizer = optim.Adam(model.parameters()) else: checkpoint = torch.load('model_checkpoint.pth') model = Model().cuda() model.load_state_dict(checkpoint['state_dict']) optimizer = optim.Adam(model.parameters()) optimizer.load_state_dict(checkpoint['optimizer']) start_epoch = checkpoint['epoch'] + 1 train(model, optimizer, start_epoch=start_epoch) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值