博客
关于我
2020-05-31 py执行时超时控制
阅读量:591 次
发布时间:2019-03-12

本文共 3311 字,大约阅读时间需要 11 分钟。

Python 多线程任务控制简易方案

背景

随着计算机任务处理需求的不断扩大,如何高效地控制和管理多个任务的执行时间、资源使用等问题逐渐成为开发者关注的重点。传统的单线程应用在面对多任务需求时往往表现出性能瓶颈,或者难以对复杂任务执行时间进行精确控制。本文将介绍一个基于Python多线程的简易任务控制方案,通过多线程实现对任务执行时间的细致控制,提升任务处理效率。

方案概述

本方案采用多线程的方式来实现对任务执行时间的精确控制。具体来说,通过定义一个轻量级的多线程任务类和一个任务执行控制器,将需要执行的任务分解为多个独立的线程进行处理。每个线程可独立占用CPU资源,任务完成时间可以灵活配置,从而减少任务处理延迟。

核心实现

多线程任务类

任务类是实现任务执行的核心。它定义了线程的执行入口、参数传递机制以及结果的获取方式。类似常见的线程池实现,通过TaskThread类实现线程的启动和管理。大致包括以下几个方面:

  • 线程初始化:设置执行目标和参数。
  • 线程启动:通过继承threading.Thread,设置线程为守护线程。
  • 结果处理:线程结束后获取执行结果,并在必要时进行异常处理。
  • 任务执行控制器

    任务执行控制器负责协调多个线程的运行。通过协调不同的线程,控制任务的整体执行流程。控制器的主要功能有:

  • 线程启动:初始化线程并启动执行。
  • 资源释放:确保线程在指定时间内及时终止。
  • 结果收集:将各个线程的执行结果汇总,返回给用户。
  • 时间控制机制

    一种常见的问题是如何实现对任务执行时间的精确控制。本方案采用轮询机制,通过定期轮询线程的执行状态,判断是否达到预定时间限制。具体实现包括:

  • 周期性轮询:设定轮询周期为1秒,进行线程执行状态检查。
  • 结果返回机制:当某个线程完成执行,立即返回结果。
  • 超时处理:当线程长时间未完成,主动终止该线程,继续轮询其他线程。
  • 实现细节

    实现步骤

    为了更好地理解本方案,可以按照以下步骤进行介绍:

  • 导入必要的库:如threadingtime模块用于线程和时间管理。
  • 定义线程类:创建轻量级的线程类TaskThread,实现便于扩展的线程管理。
  • 创建装饰器:通过装饰器LimitDecor实现任务执行时间的限制。
  • 启动任务:通过Start函数启动并等待任务完成,获取最终结果。
  • 代码示例

    import threadingimport timeclass TaskThread(threading.Thread):    def __init__(self, target, args=()):        super().__init__()        self.func = target        self.args = args    def run(self):        self.result = self.func(self.args)    def GetResult(self):        try:            return self.result        except Exception:            return Noneclass LimitDecorator:    def Functions(func):        def Run(params):            limit_time = params[0]            thre_func = TaskThread(target=func, args=params)            thre_func.setDaemon(True)            thre_func.start()            sleep_num = int(limit_time // 1)            sleep_left = round(limit_time % 1, 1)            while True:                time.sleep(1)                if thre_func.isAlive():                    pass                else:                    info = thre_func.GetResult()                    if info:                        return info                    break                if sleep_num <= 0:                    break                thre_func.join(timeout=sleep_left)            return thre_func.GetResult()        return Rundef Start(limit_time, process):    thSetter = TaskThread(target=Task, args=[limit_time, process])    thSetter.start()    thSetter.join()    return thSetter.GetResult()class Task:    def __init__(self, args=()):        self.args = args    def Run(self):        process = self.args[1]        info = process.Run()        return infoclass Process:    def __init__(self, args=()):        self.args = args    def Run(self):        print("start Process: args --", self.args)        print("start Process: sleep 4s")        time.sleep(4)        print("over Process")        return None

    具体说明

  • 线程类实现:除了基本的runGetResult方法外,线程类还实现了异常处理机制,确保任务结果获取的可靠性。

  • 装饰器机制:通过LimitDecorator实现了对任务执行时间的限制功能。每个任务都配有时间限制,超出的部分会自动终止并继续执行下一个任务。

  • 任务启动与管理:主函数Start负责启动线程并等待其完成。通过定期轮询和主线程的管理,实现了对多线程资源的有效控制。

  • 控制机制:采用轮询的方式监控线程状态。当线程超出时间限制后,通过thre_func.join(timeout)优雅地退出当前线程,并继续执行下一阶段任务。

  • 应用场景与示例

    这种多线程任务控制方案在多个场景中都有实际应用。例如,需要对网络请求超时时间进行严格控制,处理批量数据导入等需要精确时间控制的任务。以下是一个简单的示例:

    from Process import Processfrom Start import Startprocess = Process(["log Analyzer", "Cohesive Analyze"])result = Start(10, process)print("完成的结果为:", result)

    总结

    通过以上实现,我们可以用一种简洁的方式对Python任务的执行时间进行控制,解决需要多线程任务管理和时间限制的场景。这个方案不仅代码简洁,而且功能灵活,适合在多线程环境下进行复杂任务的协调管理。在实际应用中,可以根据具体线程调度需求对任务控制器进行适当的参数优化,进一步提升性能和效率。

    转载地址:http://bocxz.baihongyu.com/

    你可能感兴趣的文章
    C++ Primer Plus读书笔记:循环读取(错误处理)
    查看>>
    《架构师36项修炼》Mysql 异常情况下的事务安全 -- 详解 Mysql redolog
    查看>>
    skimage与cv2 安装失败的解决办法
    查看>>
    linuxmint 上面装谷歌浏览器
    查看>>
    windows/linux下Anaconda管理的(安装的)包的位置
    查看>>
    关于吴恩达的深度学习的一些授课视频里面英文翻译错误的实例展示
    查看>>
    伴随矩阵和逆矩阵的关系证明
    查看>>
    反向传播之矩阵求导dL/dz1的求导过程 普通神经网络的逆向求导过程
    查看>>
    numpy.linspace使用详解
    查看>>
    突破Bias-Variance困境
    查看>>
    CNN / language modelling and sequence generation
    查看>>
    函数可导和可微的区别: 一元中互为充要;多元中可微是可导的必要条件,可导不一定可微。
    查看>>
    一文说尽C++赋值运算符重载函数(operator=)
    查看>>
    Form窗体属性
    查看>>
    Nintendo - NES Emulators 网站
    查看>>
    android market 开发者注册
    查看>>
    1024程序员节
    查看>>
    删除文件提示“您需要权限才能执行此操作”如何解决
    查看>>
    IC封装图片大全
    查看>>
    自恢复保险丝的选用
    查看>>