Python代码片段-断点任务

news/2025/2/26 13:47:33

使用Python处理一堆长耗时任务的时候,为了防止异常退出程序或者手动退出程序后丢失任务进度,可用使用断点的方式记录任务进度,下次重载任务后,继续运行上次未完成的任务即可。

这里用json文件作为数据持久化的方式,免去了使用数据库来作为持久的依赖问题,为了一个小的任务来搭建一套数据库,耗时耗力,得不偿失,不如选择本地文件来做简单的持久化,就算丢失部分任务进度,少数任务重新执行所消耗的时间完全处于容忍范围内。另外使用json文件记录任务进度,可用修改json文件来人为干预任务的执行情况,也是不错的一个优点

python">import json
import time
import os


class Task:
    def __init__(self, task_file='task_progress.json'):
        self.task_file = task_file
        self.progress = []
        if os.path.exists(self.task_file):
            self.load_progress()

    def load_progress(self):
        """加载任务进度"""
        with open(self.task_file, 'r') as f:
            data = json.load(f)
            self.progress = data.get('progress', 0)

    def save_progress(self):
        """保存任务进度"""
        data = {'progress': self.progress}
        with open(self.task_file, 'w') as f:
            json.dump(data, f,indent=4, separators=(',', ': '))
            f.flush()
            os.fsync(f.fileno())  # 确保数据已写入磁盘

    def execute_task(self):

        legacy_tasks = [t  for t in self.progress if t['finish'] ==0 ]

        for i, v in enumerate(legacy_tasks):
            print(f"执行任务 {v['key']} ...")
            time.sleep(3)  # 模拟任务执行的时间
            self.mark_finished( v['key']) # 更行进度
            self.save_progress()  # 每次执行后保存进度
            print(f"任务 {v['key']} 完成。")

        print("任务完成!")

    def flush_progresses(self):
        tasks = [
            {"key":"xxx1"},
            {"key":"xxx2"},
            {"key":"xxx3"}
        ]

        self.progress = [ {"key" : t['key'], 'finish':0} for t in tasks]
        self.save_progress()

    def mark_finished(self, key):
        """标记完成"""
        print(key)
        for i, t in enumerate(self.progress) :
            if t ['key'] ==  key :
                self.progress[i]['finish'] = 1
                break
        self.save_progress()
    
    def count(self):
        """查询未完成"""
        return len( [t for t in self.progress if t['finish'] == 0])



if __name__ == "__main__":
    task = Task()
    # 第一次生成任务列表,下次任务时候注释掉此行
    task.flush_progresses()
    try:
        task.execute_task()
    except KeyboardInterrupt:
        print("\n任务被中断,进度已保存。")

http://www.niftyadmin.cn/n/5868789.html

相关文章

YOLOv10 解析与地平线 征程 6 模型量化

一,YOLOv10 解析 1.简介 近些年来,研究人员对 YOLO 的架构设计、优化目标、数据增强策略等进行了探索,取得了显著进展。然而,后处理对非极大值抑制(NMS)的依赖阻碍了 YOLO 的端到端部署,并对推…

一个std::async的示例

目录 一、问题引出 二、关键点解释 1.生成随机数 2.异步启动两个操作 3.检查异步任务是否为延迟执行并轮询任务状态 4.等待所有任务完成并处理异常 三、总结 一、问题引出 从《c标准库》(第2版)看到一个std::async的例子。演示了使用 std::async…

《零基础学会!如何用 sql+Python 绘制柱状图和折线图,数据可视化一看就懂》

在数据驱动的时代,MySQL 是最常用的关系型数据库管理系统之一,广泛应用于各类数据存储和处理场景。数据分析的过程不仅仅是收集数据,还包括数据的清洗、转换、查询以及最终的报告和可视化。在本文中,我们将通过实际案例来介绍如何…

Java+SpringBoot+Vue+数据可视化的音乐推荐与可视化平台(程序+论文+讲解+安装+调试+售后)

感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望帮助更多的人。 系统介绍 在互联网技术以日新月异之势迅猛发展的浪潮下,5G 通信技术的普及、云计算能力…

Golang适配达梦数据库连接指定模式

1、达梦官方适配文档:https://eco.dameng.com/document/dm/zh-cn/start/GO_DM_NEW.html 2、连接指定模式方式:dataSourceName : “dm://SYSDBA:*****192.168.40.1:5237?schemaTESTDB” 3、beego orm适配遇到问题: 3.1、q:同一用户下不同模式…

Go Channel 高级模式实战:超时控制与广播机制的深度解析

1. 前言 在 Go 语言的并发世界中,channel 是我们手中的一把利器,它让 goroutine 间的通信变得优雅而高效。如果你已经用 channel 实现过简单的生产者-消费者模型,或者在 select 中处理过并发任务,那么恭喜你,你已经迈…

如何实现将http请求转化为rpc请求

以下是10个可以实现HTTP请求转发到内部RPC服务的GitHub项目推荐,这些项目涵盖了多种语言和框架,适用于不同的技术栈和需求: 1. **grpc-gateway** grpc-gateway 是一个流行的开源项目,用于将HTTP请求转发到gRPC服务。它支持通…

第9章 机器学习与统计模型

这一章重点探讨统计模型和机器学习模型,两个大的主题都建立在数据的基础之上,所以要熟练掌握对数据的处理与分析。实际上,机器学习本身就是统计模型的延伸,是在大数据背景下传统统计方法捉襟见肘了,所以才考虑引入机器…