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

发布时间:2026/7/15 1:27:53

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/15 0:10:12

前言:航拍小目标检测的“至暗时刻” 无人机航拍正在以前所未有的速度渗透进智慧城市、精准农业、安防巡检、交通监管等各个领域。然而,当你的检测模型面对一张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/14 10:57:30

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

5分钟快速上手:用foobox-cn打造你的专属foobar2000音乐播放器

5分钟快速上手:用foobox-cn打造你的专属foobar2000音乐播放器

2026/7/15 14:29:00

5分钟快速上手&#xff1a;用foobox-cn打造你的专属foobar2000音乐播放器 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn 还在为foobar2000的简陋界面而烦恼吗&#xff1f;想要一款既美观又实用的音乐…

流放之路2交易助手Exiled Exchange 2:新手玩家的完整价格查询与装备评估指南

流放之路2交易助手Exiled Exchange 2:新手玩家的完整价格查询与装备评估指南

2026/7/15 14:29:00

流放之路2交易助手Exiled Exchange 2&#xff1a;新手玩家的完整价格查询与装备评估指南 【免费下载链接】Exiled-Exchange-2 Path of Exile 2 trading app for price checking 项目地址: https://gitcode.com/gh_mirrors/ex/Exiled-Exchange-2 在《流放之路2》这个复杂…

Agents-A1-8bit在Mac上的完美运行:M系列芯片性能优化指南

Agents-A1-8bit在Mac上的完美运行:M系列芯片性能优化指南

2026/7/15 14:29:00

Agents-A1-8bit在Mac上的完美运行&#xff1a;M系列芯片性能优化指南 【免费下载链接】Agents-A1-8bit 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/Agents-A1-8bit Agents-A1-8bit是专为MLX框架优化的8位量化视觉语言模型&#xff0c;基于Qwen3.5-MoE…

NVIDIA DVLT实战案例:如何将普通视频转换为高精度3D模型?

NVIDIA DVLT实战案例:如何将普通视频转换为高精度3D模型?

2026/7/15 14:29:00

NVIDIA DVLT实战案例&#xff1a;如何将普通视频转换为高精度3D模型&#xff1f; 【免费下载链接】dvlt 项目地址: https://ai.gitcode.com/hf_mirrors/nvidia/dvlt 想要将普通视频快速转换为高精度3D模型吗&#xff1f;NVIDIA的DVLT&#xff08;Dj View Looping Trans…

终极指南:如何在Android应用中实现惊艳的液态玻璃光影效果

终极指南:如何在Android应用中实现惊艳的液态玻璃光影效果

2026/7/15 14:29:00

终极指南&#xff1a;如何在Android应用中实现惊艳的液态玻璃光影效果 【免费下载链接】AndroidLiquidGlass Compose Multiplatform Liquid Glass effect 项目地址: https://gitcode.com/gh_mirrors/an/AndroidLiquidGlass 想要为你的Android应用添加如iPhone般流畅的玻…

仅限本周开放的增肌方案生成权限:ChatGPT专业版增肌模块首次对C端用户解禁(含IGF-1响应模拟算法)

仅限本周开放的增肌方案生成权限:ChatGPT专业版增肌模块首次对C端用户解禁(含IGF-1响应模拟算法)

2026/7/15 14:19:00

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;仅限本周开放的增肌方案生成权限&#xff1a;ChatGPT专业版增肌模块首次对C端用户解禁&#xff08;含IGF-1响应模拟算法&#xff09; 本周起&#xff0c;ChatGPT专业版正式向个人用户开放其底层生物建模…

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

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

2026/7/14 10:03:09

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/13 20:43:19

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/15 0:26:43

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

【LINUX】驱动

【LINUX】驱动

2026/7/15 0:08:14

【LINUX驱动】【字符设备】【中断】【Platform】【网课 设备树】【GPIO】【PINCTRL】【INPUT】【IIC】【SPI】【网络驱动】【屏幕驱动】【一 设备树】【二 内核模块编译】【三 基本驱动框架】【四 Platform总线设备驱动框架】【五 驱动子系统】【六 综合】

【1982-2026】全国高精度建筑轮廓|村级精度|SHP矢量

【1982-2026】全国高精度建筑轮廓|村级精度|SHP矢量

2026/7/15 0:08:14

&#x1f50d; 数据简介 本次分享1982-2026年全国村级精度建筑轮廓矢量数据&#xff0c;覆盖全国各省市区县&#xff0c;到村级别精细&#xff0c;为2026年最新实时采集成果&#xff0c;非网传仅60/77个城市的老旧数据。 数据含带高度/不带高度双版本&#xff0c;单体建筑边界精…

【1975-2026】全国水系水路数据|河流/水库/运河|SHP矢量

【1975-2026】全国水系水路数据|河流/水库/运河|SHP矢量

2026/7/15 0:08:14

&#x1f50d; 数据简介 本次分享1975-2026年全国高精度水系水路矢量数据&#xff0c;覆盖全国全域&#xff0c;包含河流、水系、水库、运河、湿地、冰川、沟渠等全类别水文要素。 数据集包含双层矢量图层&#xff0c;字段分类清晰、要素齐全&#xff0c;支持2013-2026逐年完整…