使用 Python multiprocessing 实现进度跟踪

在使用 Python 的 multiprocessing 模块进行并行处理时,进度跟踪是一个重要的需求。我们希望在执行多个进程时能够实时监控其完成进度。本文将指导你如何实现这一功能。

整体流程

下面的表格展示了实现进度跟踪的整体步骤:

步骤 描述
1 导入必要的模块
2 定义需要并行处理的任务
3 创建进程与队列
4 启动进程,并向队列报告进度
5 主进程监控队列获取进度
6 等待所有进程完成并关闭队列

每一步的实现

第一步:导入必要的模块

我们首先需要导入 multiprocessing 和其他一些必要的库。

import multiprocessing
import time
import random
  • multiprocessing: 用于实现进程间的并行处理。
  • time: 控制时间的函数,例如延时。
  • random: 生成随机数,用于模拟任务的执行时间。

第二步:定义需要并行处理的任务

定义一个处理任务的函数,并在函数执行过程中向父进程报告进度。

def worker(task_id, progress_queue):
    # 模拟任务执行
    total_steps = 10
    for step in range(total_steps):
        time.sleep(random.uniform(0.1, 0.5))  # 模拟任务耗时
        # 向队列发送进度
        progress_queue.put((task_id, step + 1, total_steps))
  • worker: 一个接受任务ID和进度队列的函数,模拟处理任务。
  • queue.put: 将进度信息发送到进度队列。

第三步:创建进程与队列

在主程序中,创建一个进度队列和处理进程的列表。

if __name__ == '__main__':
    # 创建进度队列
    progress_queue = multiprocessing.Queue()
    
    # 定义进程列表
    processes = []
    
    # 创建多个进程
    for i in range(5):  # 假设我们有5个任务
        p = multiprocessing.Process(target=worker, args=(i, progress_queue))
        processes.append(p)
        p.start()  # 启动进程
  • multiprocessing.Queue: 用于进程间传递信息。
  • multiprocessing.Process: 用于创建新进程。

第四步:启动进程,并向队列报告进度

如上代码所示,启动了多个进程来并行执行任务,并将进度通过队列发送。

第五步:主进程监控队列获取进度

主进程需要不断从队列中读取进度信息,直到所有进程完成。

    while True:
        # 检查进程状态
        for p in processes:
            p.join(timeout=0.1)  # 检查进程是否还在运行

        # 检查进度队列
        while not progress_queue.empty():
            task_id, completed_steps, total_steps = progress_queue.get()
            print(f'Task {task_id}: {completed_steps}/{total_steps} steps completed.')

        # 如果所有进程都结束,退出监控
        if all(not p.is_alive() for p in processes):
            break
  • p.join(timeout): 等待进程结束或超时。
  • progress_queue.get(): 从队列中获取进度信息。

第六步:等待所有进程完成并关闭队列

确保所有进程都处理完毕后,之后可以关闭进程和队列以确保资源释放。

    # 确保所有进程都结束
    for p in processes:
        p.join()  # 等待所有进程完成

    print("All tasks are completed!")

旅行图示例

使用 mermaid 图形化工具可以帮助我们更好地理解流程,下面是实现进度跟踪的旅程图:

journey
    title Python multiprocessing 进度跟踪
    section 准备
      导入必要的模块: 5: Me
      定义任务: 5: Me
    section 运行
      创建进程与队列: 5: Me
      启动进程: 5: Me
    section 监控进度
      主进程监控队列: 5: Me
      完成并关闭: 5: Me

结尾

在本文中,我们通过具体的步骤和代码示例讲解了如何在 Python 中使用 multiprocessing 模块实现任务的并行处理与进度监控。希望这些示范能够帮助你构建高效、有进度反馈的应用程序。尽管起初可能会感到困惑,但随着实践的深入,你会渐渐掌握多进程编程的精髓!如果你对并行处理有进一步的疑问或需求,欢迎随时向我咨询。