亲爱的慕友们,在学习了 Python 的多进程编程知识后,我们了解到多进程能够充分利用多核 CPU 的计算能力,大大提高程序的运行效率。课程中老师讲解了 multiprocessing 模块的基本使用,但在实际应用中,如何合理地分配任务给各个进程,以达到最优的处理效果呢?不同的任务分配策略又会对整体性能产生怎样的影响?欢迎小伙伴们一起讨论交流各自的想法和见解~
题目:
在大数据处理、科学计算等领域,常常需要处理大量的任务,为了提高处理效率,多进程技术被广泛应用。本次作业要求你设计一个多进程任务调度系统,模拟分配任务并处理的场景,锻炼你对多进程编程、任务分配和结果汇总等知识的掌握。
具体任务如下:
1、定义一个包含多个任务参数的列表,每个任务可以是一个简单的计算任务,比如计算一个范围内整数的平方和。每个任务参数包含任务的起始整数和结束整数。
2、创建多个进程,每个进程负责处理一部分任务。根据 CPU 核心数合理分配任务,尽量使每个进程的工作量均衡。
3、每个进程完成分配的任务后,将计算结果返回。主线程等待所有进程完成任务后,汇总所有进程的计算结果。
4、输出最终的汇总结果。
预期结果:
假设任务参数列表为 [(1, 100), (100, 200), (200, 300), (300, 400)],即有四个任务,分别计算 1 - 99、100 - 199、200 - 299、300 - 399 这些范围内整数的平方和并汇总。经过正确计算,最终的汇总结果应为 21253400。这意味着当你按照作业要求正确实现多进程任务调度系统时,程序输出的最终汇总结果应该是 21253400。
一、开发语言与环境要求
1、语言版本:Python3(与课程视频中使用的 Python 版本保持一致)
2、开发工具:PyCharm(与课程视频中推荐的开发工具相同)
3、依赖模块:需使用 Python 内置的multiprocessing模块实现多进程功能,无需额外安装第三方模块(若因环境问题需安装,可通过pip install multiprocessing命令补充安装)
二、程序整体要求
1、完成需求中涉及的所有功能,包括定义任务参数列表、创建多进程分配任务、进程返回计算结果、主线程汇总结果并输出最终值。
2、Python 代码书写、命名需严格符合 PEP 8 规范:变量名采用小写字母 + 下划线形式(如task_list、cpu_core_num),函数名采用动词 + 名词形式(如create_task_list、calculate_square_sum),避免使用拼音、无意义字符(如a1、temp)作为命名;代码缩进统一使用 4 个空格,杜绝混用空格与制表符。
3、代码结构需层次分明,采用 “功能模块化” 设计思路:将 “创建任务列表”“计算单个任务结果”“分配任务到进程”“汇总结果” 等功能拆分到不同函数中,避免所有代码堆砌在主程序内。
4、在关键代码段(如多进程创建逻辑、任务分配算法、结果汇总步骤)添加适量注释,注释需简洁明了,说明代码功能或核心逻辑(如 “根据 CPU 核心数平均分配任务,确保各进程工作量均衡”)。
5、程序运行需稳定:确保主线程能正确等待所有子进程完成任务,无进程卡死、结果丢失等问题;最终输出的汇总结果需与预期结果(21253400)一致。
6、将作业项目整理为规范文件夹(文件夹命名为 “多进程任务调度系统”),内部包含主程序文件(命名为 “main.py”),若有额外的工具类代码可创建 “utils.py” 文件存放,最终将整个文件夹压缩为 ZIP 格式提交。
三、详细设计
1、自定义任务参数列表创建函数
(1)功能:生成符合题目要求的任务参数列表,每个任务参数为包含 “起始整数” 和 “结束整数” 的元组,示例任务参数列表为[(1, 100), (100, 200), (200, 300), (300, 400)](也可支持自定义任务数量与数值范围)。
(2)实现思路:通过列表推导式或直接定义的方式生成任务列表,确保每个元组内的起始值小于结束值,避免无效任务;函数需返回生成的任务参数列表,供后续进程调用。
2、自定义单个任务计算函数
(1)功能:接收单个任务的 “起始整数” 和 “结束整数” 参数,计算该范围内(注意:题目示例中为 “1-99” 对应参数 (1,100),即取左闭右开区间)所有整数的平方和。
(2)实现思路:通过循环遍历任务范围内的整数,计算每个整数的平方并累加;也可使用数学公式优化计算效率(如平方和公式:
,计算“a到b-1”的平方和可转化为“1到b-1的平方和减去1到a-1的平方和”)。
3、自定义多进程创建与任务分配函数
(1)功能:
获取 CPU 核心数,根据核心数将任务列表中的任务均衡分配给多个进程;创建子进程并执行任务,收集每个进程的计算结果;主线程等待所有子进程完成后,返回所有任务的结果列表。
(2)实现思路:
通过multiprocessing.cpu_count()获取当前设备的 CPU 核心数,作为进程数量(若任务数量少于核心数,可将进程数量设为任务数量,避免资源浪费)。
采用 “平均分配” 策略拆分任务列表:例如 4 个任务、2 个 CPU 核心,则每个进程分配 2 个任务;若任务数量无法被核心数整除,最后一个进程可多分配 1 个任务(如 5 个任务、2 个核心,进程 1 分配 2 个,进程 2 分配 3 个)。
使用multiprocessing.Pool(进程池)或multiprocessing.Process创建进程:进程池适合自动管理进程数量,Process需手动管理进程创建与结果收集;通过apply_async(异步调用)或Queue(队列)传递任务参数与接收结果。
一、项目规范【20 分】
1.文件与变量命名(8 分)
(1)主文件为 “main.py” 得 4 分,否则不得分;变量名符合 PEP 8 规范(小写 + 下划线)得 4 分,1-2 处不规范扣 2 分,3 处及以上扣 4 分。
2.代码结构与注释(12 分)
(1)功能拆分为独立函数(创建任务、计算、分配进程、汇总)得 6 分,代码堆砌扣 3-6 分;缩进统一(4 空格)得 3 分,混乱扣 1-3 分;关键逻辑(进程创建、任务分配)有注释得 3 分,缺失扣 1-3 分。
二、程序运行与核心功能【40 分】
1.基础运行效果(15 分)
(1)无语法错误可启动得 5 分,否则不得分;主线程等待所有子进程完成得 5 分,提前结束扣 3-5 分;汇总结果 = 21253400 得 5 分,错误扣 2-5 分。
2.核心函数实现(25 分)
(1)任务列表创建函数:生成指定列表 + 参数校验 + 返回值得 6 分,缺一项扣 2 分。
(2)平方和计算函数:正确计算左闭右开区间结果 + 返回值得 7 分,逻辑错扣 4-7 分。
(3)多进程分配函数:获取 CPU 核心数 + 均衡分配任务 + 用multiprocessing创建进程 + 收集结果得 12 分,缺一项扣 3 分。
三、任务分配与资源利用【20 分】
进程数匹配 CPU 核心数与任务数(如任务少则进程数 = 任务数,任务多则进程数 = 核心数)得 12 分,固定进程数(如始终 2 个)扣 5-12 分。
无资源浪费(如 1 任务不启动多进程)得 8 分,存在明显浪费扣 4-8 分。
四、结果处理与异常防控【20 分】
1.结果汇总与输出(10 分)
(1)自定义函数求和得 5 分,逻辑错扣 3-5 分;输出含 “各任务结果 + 最终汇总” 得 5 分,仅输出汇总扣 2-5 分。
2.异常处理(10 分)
(2)任务创建、进程执行、结果获取环节用try-except捕获得 6 分,无则扣 3-6 分;异常提示明确(如 “任务参数无效”)得 4 分,仅捕获无提示扣 2-4 分。