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

发布时间:2026/8/27 19:10:59

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/8/27 14:02:24

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

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

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

2026/8/26 16:39:10

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/8/27 11:01:54

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

一个双非软件工程本科生的逆风翻盘经历

一个双非软件工程本科生的逆风翻盘经历

2026/8/27 19:08:19

写在前面 我的高考分数不高&#xff0c;只上了一个很一般的学校&#xff0c;也对自己的专业不感兴趣。但庆幸的是&#xff0c;大学四年&#xff0c;我慢慢的对编程产生了兴趣&#xff0c;学会了如何学习并走入了编程的大门。 后来还算顺利吧&#xff01;考上了某211硕&#xff…

多角色对话 AI 配音,短剧旁白轻松制作

多角色对话 AI 配音,短剧旁白轻松制作

2026/8/27 19:08:19

短剧赛道持续升温&#xff0c;从竖屏微短剧到小说推文配画面&#xff0c;"一人旁白 多角色对话"几乎成了标配结构。但多角色配音恰恰是 AI 配音中最容易翻车的环节——角色声音撞型、情绪衔接断裂、旁白和对话混在一起没有层次感。本文从多角色配音的实际难点出发&a…

实测11款AI配音工具,真正能商用的只有这几个

实测11款AI配音工具,真正能商用的只有这几个

2026/8/27 19:08:19

先声明&#xff1a;无广&#xff01;纯自用踩坑经验&#xff0c;看完能帮你省至少500块会员费 &#x1f447;&#x1f624; 踩坑篇&#xff1a;这些雷我替你们踩过了坑1&#xff1a;某知名大厂工具&#xff08;不点名了&#xff09; 号称"免费试用"&#xff0c;结果2…

爱了!阿里大神最佳总结“Flutter进阶学习笔记”,理论与实战

爱了!阿里大神最佳总结“Flutter进阶学习笔记”,理论与实战

2026/8/27 19:08:19

前言 “小步快跑、快速迭代”的开发大环境下&#xff0c;“一套代码、多端运行”是很多开发团队的梦想&#xff0c;美团也一样。他们做了很多跨平台开发框架的尝试&#xff1a;React Native、Weex、PWA 等等。但都没有得到很好的解决&#xff0c;直至遇到Flutter。 Flutter 提供…

干了5年Android开发,突然感觉自己啥也不会,啥也不想干,还要继续吗?

干了5年Android开发,突然感觉自己啥也不会,啥也不想干,还要继续吗?

2026/8/27 19:08:19

这是在某论坛看到的一名同行的吐槽&#xff1a;我干了差不多5年&#xff0c;不过给人感觉跟只有两三年的人一样。 我觉得我不适合干程序员&#xff0c;主要是新东西的接受能力比其他人慢&#xff0c;Android技术又更新得很快&#xff0c;感觉总是跟不上。年纪有些大了&#xff…

“入职一年,那个被高薪挖来的Android开发被劝退了。”

“入职一年,那个被高薪挖来的Android开发被劝退了。”

2026/8/27 18:58:18

其实&#xff0c;在很多小伙伴的想法中&#xff0c;是希望通过跳槽实现薪酬涨幅&#xff0c;可是跳槽不是冲动后决定&#xff0c;应该谨慎啊~ 01 我的学弟&#xff0c;最近向我吐槽&#xff0c;2020 年上半年入职一家公司&#xff0c;当时是高薪挖走的他&#xff0c;所谓钱到位…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/27 11:10:02

首先光是一种能量的载体和形态&#xff0c;宏观上观察到的光是由无数个微观的光量子组成的&#xff0c;每个光子在产生的瞬间&#xff0c;其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前&#xff0c;在微观层面&#xff0c;每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/27 7:25:23

1. 通话转接不是“挂断再拨号”&#xff0c;而是SIP会话的动态重定向你有没有遇到过这样的场景&#xff1a;客服坐席A正在和客户通电话&#xff0c;突然需要把这通对话无缝转给专家坐席B&#xff0c;客户完全感知不到中间的断连——既没听到忙音&#xff0c;也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/26 17:50:58

1. 为什么选择Kolla-ansible来部署单节点OpenStack&#xff1f;如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法&#xff0c;那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

2026/8/27 0:07:12

1. 项目概述&#xff1a;从零构建一个企业级的AI服务网关 最近在帮一个做内容审核的团队做技术架构升级&#xff0c;他们原来的业务里&#xff0c;每天有几十万张图片和短视频需要过审&#xff0c;最初是接了几个开源的AI模型自己部署&#xff0c;但效果和性能一直不太稳定。后…

LeetCode Hot100(51-60)算法精解与面试技巧

LeetCode Hot100(51-60)算法精解与面试技巧

2026/8/27 0:07:12

1. 题目背景与核心价值"hot100(51-60)"这个标题看起来像是某个编程题库或算法练习集中的一组题目编号。在技术社区中&#xff0c;类似命名通常指向LeetCode、牛客网等平台的热门题目集合。作为刷过300题的算法老手&#xff0c;我理解这类题目的核心价值在于&#xff…

CRC校验实战:从模2除法到HJ212协议排错

CRC校验实战:从模2除法到HJ212协议排错

2026/8/27 0:07:12

1. 为什么一个“校验码”能扛住工业现场90%的数据 corruption&#xff1f; 你有没有遇到过这样的场景&#xff1a;嵌入式设备通过RS-485上传温湿度数据&#xff0c;上位机偶尔收到一帧乱码——温度显示成-273℃&#xff0c;湿度跳到999%&#xff0c;但串口波形看起来完全正常&a…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/22 2:02:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具&#xff0c;覆盖选题构思、文献整理、内容生成、格式排版等核心场景&#xff0c;真正帮你高效搞定论文难题。 一、全流程王者&#xff1a;一站式搞定论文全链路&#xff08;一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/26 18:07:30

2026年真正好用的AI论文工具&#xff0c;核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测&#xff0c;千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队&#xff0c;覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/26 17:57:52

告别游戏崩溃&#xff1a;XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…