Python并发编程实战:多线程vs多进程性能对比,一篇文章让你彻底选对方案

发布时间:2026/7/13 7:58:26

Python并发编程实战:多线程vs多进程性能对比,一篇文章让你彻底选对方案
引言在Python开发中当我们需要同时处理多个任务时常常会面临一个经典的选择使用多线程还是多进程由于全局解释器锁GIL的存在Python的多线程并不能真正利用多核CPU实现并行计算这使得很多开发者对多线程望而却步。但多线程真的毫无用武之地吗多进程又是否在所有场景下都更优本文将通过真实的CPU密集型与IO密集型任务编写可运行的代码对比单线程、多线程与多进程的执行效率。你会看到在不同的任务类型下两者的表现截然不同。最终我们将总结出清晰的选择策略帮助你在实际项目中做出正确决策。1. 核心概念GIL、线程与进程1.1 Python的全局解释器锁GILGIL是CPython解释器中的一个互斥锁它确保同一时刻只有一个线程在执行Python字节码。这意味着即使在多核CPU上多线程也无法并行执行Python代码它只能通过快速切换线程来模拟并发。因此对于纯Python的CPU密集型任务多线程几乎无法提升性能甚至可能因为线程切换的额外开销而变得更慢。1.2 多线程适用场景虽然GIL限制了CPU密集型任务的并行性但在IO密集型场景如网络请求、文件读写、数据库查询等中线程在执行IO操作时会释放GIL让其他线程有机会执行。此时多线程可以实现真正的并发极大减少等待时间提升程序吞吐量。1.3 多进程适用场景多进程通过创建独立的解释器进程来绕过GIL每个进程拥有自己的内存空间和GIL锁因此可以真正利用多核CPU进行并行计算。对于CPU密集型任务多进程能显著缩短执行时间。但进程的创建和销毁开销较大进程间通信也比线程间共享内存复杂得多。2. 实战对比CPU密集型与IO密集型任务下面我们设计两个典型任务分别测试单线程、多线程ThreadPoolExecutor和多进程ProcessPoolExecutor的执行时间。所有代码均可直接复制运行。2.1 实验环境准备import time import math from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor, as_completed from functools import partial2.2 任务定义CPU密集型用一个计算密集的函数模拟计算一个大数的阶乘使用math.factorial纯Python循环也可这里用标准库更高效重复执行多次。def cpu_bound_task(n): CPU密集型任务计算 n 的阶乘 return math.factorial(n)为了简单起见我们让每个任务计算一个较大的数例如 100000并重复执行若干次记录总耗时。2.3 任务定义IO密集型模拟多个网络请求使用time.sleep来代表IO等待。实际项目中的网络IO、磁盘IO等原理相同。def io_bound_task(seconds): IO密集型任务模拟网络或磁盘等待 time.sleep(seconds) return seconds2.4 性能测试工具函数编写一个通用的测试函数接收任务函数、参数列表和执行器类型返回总耗时。def run_test(task_func, args_list, executor_typeNone, max_workers4): 执行测试 :param task_func: 任务函数 :param args_list: 参数列表每个元素是一个元组解包后传给任务函数 :param executor_type: thread 或 processNone 表示单线程顺序执行 :param max_workers: 最大工作线程/进程数 :return: 总耗时(秒) start time.time() if executor_type is None: # 单线程顺序执行 results [task_func(*args) for args in args_list] else: Executor ThreadPoolExecutor if executor_type thread else ProcessPoolExecutor with Executor(max_workersmax_workers) as executor: futures {executor.submit(task_func, *args): args for args in args_list} # 等待所有任务完成这里简单遍历 results [future.result() for future in as_completed(futures)] end time.time() return end - start注意ProcessPoolExecutor在提交任务时函数和参数必须可序列化pickle我们使用的函数和参数都满足。3. 完整测试代码与结果分析整合上述代码分别对CPU密集和IO密集任务进行测试。if __name__ __main__: # 测试参数设置 cpu_n 100000 # 计算阶乘的数 cpu_task_count 12 # 任务数量足够将CPU吃满 io_sleep 0.1 # 每次IO等待时间秒 io_task_count 50 # IO任务数量体现并发优势 workers 8 # 最大线程/进程数根据实际CPU核心数调整 # 准备参数列表 cpu_args [(cpu_n,) for _ in range(cpu_task_count)] io_args [(io_sleep,) for _ in range(io_task_count)] print( * 60) print(Python多线程 vs 多进程性能对比) print(fCPU任务计算 {cpu_n} 的阶乘共 {cpu_task_count} 次) print(fIO任务 每次 sleep {io_sleep} 秒共 {io_task_count} 次) print(f并发 workers 数{workers}) print( * 60) # CPU密集型测试 print(\n--- CPU密集型任务 ---) t_cpu_seq run_test(cpu_bound_task, cpu_args, executor_typeNone) print(f单线程耗时 {t_cpu_seq:.2f} 秒) t_cpu_thread run_test(cpu_bound_task, cpu_args, executor_typethread, max_workersworkers) print(f多线程耗时 {t_cpu_thread:.2f} 秒) t_cpu_process run_test(cpu_bound_task, cpu_args, executor_typeprocess, max_workersworkers) print(f多进程耗时 {t_cpu_process:.2f} 秒) # IO密集型测试 print(\n--- IO密集型任务 ---) t_io_seq run_test(io_bound_task, io_args, executor_typeNone) print(f单线程耗时 {t_io_seq:.2f} 秒) t_io_thread run_test(io_bound_task, io_args, executor_typethread, max_workersworkers) print(f多线程耗时 {t_io_thread:.2f} 秒) t_io_process run_test(io_bound_task, io_args, executor_typeprocess, max_workersworkers) print(f多进程耗时 {t_io_process:.2f} 秒)运行结果示例在你的机器上可能略有不同但趋势一致

相关新闻

YOLOv12在密集航拍场景下的困境:超过75%物体小于2000像素时如何破局?

YOLOv12在密集航拍场景下的困境:超过75%物体小于2000像素时如何破局?

2026/7/12 1:53:46

前言:航拍小目标检测的“至暗时刻” 无人机航拍正在以前所未有的速度渗透进智慧城市、精准农业、安防巡检、交通监管等各个领域。然而,当你的检测模型面对一张40003000像素的航拍图像时,一个残酷的现实摆在面前——超过75%的待检测目标可能小于2000像素,甚至有相当一部分不…

Navicat无限试用重置工具:告别14天限制的终极解决方案

Navicat无限试用重置工具:告别14天限制的终极解决方案

2026/7/13 6:10:16

Navicat无限试用重置工具:告别14天限制的终极解决方案 【免费下载链接】navicat_reset_mac navicat mac版无限重置试用期脚本 Navicat Mac Version Unlimited Trial Reset Script 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac 你是否曾因…

RIP实验需求配置

RIP实验需求配置

2026/7/11 20:25:11

实验合理划分网段根据要求得如图R1和R2分别有2个环回接口&#xff0c;有2条链路&#xff0c;所以一共要划分出6个独立子网且2^2<6<2^3所以需要向主机位借3位配置各个设备的IP地址及环回地址R1R2R3配置RIP协议1.启动RIP进程2.选择版本3.宣告&#xff08;要求&#xff1a;所…

高精度信号采集系统:AD7175-8与PIC18F26K22的硬件设计与软件实现

高精度信号采集系统:AD7175-8与PIC18F26K22的硬件设计与软件实现

2026/7/13 7:55:52

1. 高精度信号采集系统概述在工业测量、医疗设备和科学仪器等领域&#xff0c;高精度信号采集一直是核心技术挑战。AD7175-8作为ADI公司推出的32位Σ-Δ型ADC&#xff0c;具有极低的噪声和高达0.0015%的非线性误差&#xff0c;能够将微弱的模拟信号转换为高分辨率数字信号。而P…

AD7175-8与PIC18LF46K80的高精度数据采集方案

AD7175-8与PIC18LF46K80的高精度数据采集方案

2026/7/13 7:55:52

1. AD7175-8与PIC18LF46K80的黄金组合解析在工业测量和精密仪器领域&#xff0c;信号采集系统的性能往往决定了整个项目的成败。AD7175-8这款32位Σ-Δ型ADC与PIC18LF46K80微控制器的组合&#xff0c;恰好能满足大多数中高端应用场景的需求。AD7175-8提供最高50kSPS的采样率、0…

Python依赖库版本检测:auto_py2to3如何确保迁移后项目兼容性

Python依赖库版本检测:auto_py2to3如何确保迁移后项目兼容性

2026/7/13 7:55:52

Python依赖库版本检测&#xff1a;auto_py2to3如何确保迁移后项目兼容性 【免费下载链接】auto_py2to3 The ultimate purpose of the library is to enable automated and rapid code migration and provide automated testing. 项目地址: https://gitcode.com/openeuler/aut…

如何使用openEuler/Intel-Arch-doc?新手入门的3个关键步骤

如何使用openEuler/Intel-Arch-doc?新手入门的3个关键步骤

2026/7/13 7:55:52

如何使用openEuler/Intel-Arch-doc&#xff1f;新手入门的3个关键步骤 【免费下载链接】Intel-Arch-doc Documentation of Intel hardware support status and goal for openEuler 项目地址: https://gitcode.com/openeuler/Intel-Arch-doc 前往项目官网免费下载&#x…

OpenDesign Internship网站搭建全流程:基于VitePress与Vue3的实现方案

OpenDesign Internship网站搭建全流程:基于VitePress与Vue3的实现方案

2026/7/13 7:55:52

OpenDesign Internship网站搭建全流程&#xff1a;基于VitePress与Vue3的实现方案 【免费下载链接】opendesign-internship The repository of OpenDesign internship 项目地址: https://gitcode.com/openeuler/opendesign-internship 前往项目官网免费下载&#xff1a;…

STM32与TB6593FNG的直流电机控制方案设计与优化

STM32与TB6593FNG的直流电机控制方案设计与优化

2026/7/13 7:45:52

1. 项目背景与核心需求在工业自动化和嵌入式系统开发领域&#xff0c;直流电机控制一直是个经典而重要的课题。最近我在一个自动化分拣设备项目中遇到了一个棘手问题&#xff1a;标准直流电机驱动方案在动态响应和调速精度上无法满足需求。经过多方比较&#xff0c;最终选择了T…

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

2026/7/13 7:41:16

Unity游戏文本翻译架构深度解析&#xff1a;XUnity.AutoTranslator的技术实现与工程实践 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator作为Unity游戏社区中最成熟的文本翻译解决方…

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

2026/7/12 0:03:42

openEuler Raspberry Pi Kernel设备驱动开发指南&#xff1a;为树莓派硬件添加支持 【免费下载链接】raspberrypi-kernel It provides openEuler kernel source for Raspberry Pi 项目地址: https://gitcode.com/openeuler/raspberrypi-kernel 前往项目官网免费下载&…

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

2026/7/12 0:03:42

openEuler系统集成测试实战&#xff1a;基于smoke-test套件的环境验证技巧 【免费下载链接】integration-test The repo contains test suits for system integration test 项目地址: https://gitcode.com/openeuler/integration-test 前往项目官网免费下载&#xff1a;…

卡梅德生物技术快报|纯化重组蛋白:变异链球菌 SepM 截短蛋白载体构建、诱导优化与纯化重组蛋白全套参数方案

卡梅德生物技术快报|纯化重组蛋白:变异链球菌 SepM 截短蛋白载体构建、诱导优化与纯化重组蛋白全套参数方案

2026/7/13 0:05:25

1 研究背景与现存技术痛点&#xff08;提出问题&#xff09;在口腔微生物分子机制研究中&#xff0c;SepM 蛋白酶是调控变异链球菌群体感应、致龋菌素合成的核心功能蛋白&#xff0c;体外功能验证、抗体开发均依赖高纯度可溶性 SepM 蛋白。当前原核表达体系针对 SepM 存在三大技…

卡梅德生物技术快报|重组蛋白的表达和纯化:IMAC 金属螯合色谱全流程工艺手册|基质 - 配基 - 金属离子匹配与蛋白质分离纯化参数优化

卡梅德生物技术快报|重组蛋白的表达和纯化:IMAC 金属螯合色谱全流程工艺手册|基质 - 配基 - 金属离子匹配与蛋白质分离纯化参数优化

2026/7/13 0:05:25

1 研究背景与现存技术痛点&#xff08;提出问题&#xff09;基因工程、蛋白质组学、生物制药研发流程中&#xff0c;蛋白质分离纯化是决定下游实验成败的关键环节。当前实验室常规蛋白质分离纯化工艺存在三类难以标准化的技术瓶颈&#xff1a;传统离子交换、分子筛层析无特异性…

卡梅德生物技术快报|蛋白质分离纯化:肠激酶可溶性原核表达 + 两步层析全参数|标准化蛋白质分离纯化 SOP

卡梅德生物技术快报|蛋白质分离纯化:肠激酶可溶性原核表达 + 两步层析全参数|标准化蛋白质分离纯化 SOP

2026/7/13 0:05:25

研究痛点提出&#xff08;提出问题&#xff09;重组肠激酶是融合标签切除核心工具酶&#xff0c;当前原核表达体系存在三大标准化难题&#xff0c;直接阻碍可复现的蛋白质分离纯化流程搭建&#xff1a;Trx、GST、单 SUMO 标签融合产物绝大多数为包涵体&#xff0c;沉淀占比超 9…