Python多进程编程执行任务

我的需求如下:现有一批任务,使用进程池执行,每个任务执行耗时不一样,任务并发执行期间,需要每隔一段时间监控任务执行进度

直接贴代码:

python 复制代码
import multiprocessing
import time
import random
from multiprocessing import Pool, Manager


def worker(task_id, task_status, lock):
    """任务执行函数,模拟不同耗时操作"""
    try:
        # 记录任务开始状态
        with lock:
            task_status[task_id] = "running"

        # 随机生成任务执行时间(30秒到30分钟)
        execution_time = random.uniform(1, 30)
        time.sleep(execution_time)

        # 更新任务完成状态
        with lock:
            task_status[task_id] = "completed"
        return f"Task {task_id} completed"
    except Exception as e:
        with lock:
            task_status[task_id] = f"failed: {str(e)}"
        return f"Task {task_id} failed"


def monitor_tasks(task_status, total_tasks, lock):
    """任务监控函数,每30秒输出状态"""
    while True:
        time.sleep(10)
        with lock:
            running = [k for k, v in task_status.items() if v == "running"]
            completed = [k for k, v in task_status.items() if v == "completed"]
            failed = [k for k, v in task_status.items() if v == "failed"]
            remaining = total_tasks - len(running) - len(completed)

        print(f"\n=== 系统状态监控 ===")
        print(f"正在执行的任务数: {len(running)}")
        print(f"任务详情: {running}")
        print(f"剩余任务数: {remaining}")
        print(f"已完成任务数: {len(completed)}")
        print(f"失败任务数: {len(failed)}")
        print("====================")


if __name__ == '__main__':
    # 初始化管理器
    manager = Manager()
    lock = manager.Lock()

    # 创建任务状态字典(任务ID: 状态)
    task_status = manager.dict()
    total_tasks = 100

    # 初始化所有任务状态为"pending"
    for i in range(total_tasks):
        task_status[i] = "pending"

    # 创建进程池
    with Pool(processes=16) as pool:
        # 提交所有任务
        for task_id in range(total_tasks):
            pool.apply_async(worker, args=(task_id, task_status, lock))

        # 启动监控线程
        monitor_process = multiprocessing.Process(
            target=monitor_tasks,
            args=(task_status, total_tasks, lock)
        )
        monitor_process.start()

        # 等待所有任务完成
        pool.close()
        pool.join()

        # 终止监控进程
        monitor_process.terminate()
        monitor_process.join()
相关推荐
阿珊和她的猫1 小时前
v-scale-scree: 根据屏幕尺寸缩放内容
开发语言·前端·javascript
加班是不可能的,除非双倍日工资5 小时前
css预编译器实现星空背景图
前端·css·vue3
桦说编程6 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
lifallen6 小时前
Java Stream sort算子实现:SortedOps
java·开发语言
IT毕设实战小研6 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
wyiyiyi6 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
mit6.8246 小时前
[1Prompt1Story] 滑动窗口机制 | 图像生成管线 | VAE变分自编码器 | UNet去噪神经网络
人工智能·python
没有bug.的程序员6 小时前
JVM 总览与运行原理:深入Java虚拟机的核心引擎
java·jvm·python·虚拟机
gnip6 小时前
vite和webpack打包结构控制
前端·javascript
excel7 小时前
在二维 Canvas 中模拟三角形绕 X、Y 轴旋转
前端