编程学习网 > 编程语言 > Python > 耗时从 13s 降到 3s:手把手教你拆解 Python 多线程的奥秘
2026
03-14

耗时从 13s 降到 3s:手把手教你拆解 Python 多线程的奥秘


今天要聊的这个话题,不仅是面试官的“心头好”,更是决定你程序性能高低的关键——Python 多线程。在解释枯燥的定义之前,我们先来看两个真实的实验对比。看完你就会明白,为什么一定要学多线程。

假设我们现在有一个爬虫任务:需要使用最常用的 requests 库去爬取 4 个指定的 URL 网址。

现场实测:13秒 vs 3秒,效率差在哪?

在进入理论之前,我们先还原一下那个让无数新手崩溃的场景。假设你要写一个监控程序,或者是爬取几个网页的数据。

1. 传统模式:单线程(Sequential)

我们定义一个 Fetch 函数,模拟网络请求:


逻辑推导:

第一个 URL 结束...

第二个 URL 结束...

第三个、第四个依次结束。

最终耗时:约 13 秒。


原理分析: 这种方式就像在食堂排队打饭,前面一个人没打完,后面的人只能干等着。程序的总用时 = 4个请求的运行时间 + 网络开销。它是顺序执行的,效率极低。

2. 进化模式:多线程(Multi-threading)

同样的 URL,同样的请求函数,唯一不同的是:我们引入了多线程(Threading)。


运行效果:

屏幕上会瞬间弹出四个“开始爬取”,紧接着几乎同时弹出四个“返回码”。

  • 最终耗时:3.4 秒。


为什么这么快?

因为当第一个线程在“等网络返回”的时候,CPU 并没有闲着,它立刻跳去处理第二个、第三个线程。它利用了那些原本被浪费掉的等待时间。

深度解析:进程与线程的“血缘关系”

如果你是 Windows 用户,请按下 Ctrl+Alt+Del 打开任务管理器;如果是 Mac 用户,可以打开活动监视器。

你会发现:


1. 什么是进程(Process)?

在你的电脑里,每一个独立运行的程序就是一个进程

  • 你打开微信,系统分配一块内存,这就是一个进程。
  • 你打开 Chrome 浏览器,这又是一个进程。
  • 特点: 进程之间是相互独立的。微信崩了,通常不会影响你的浏览器。但代价是,创建一个进程需要分配独立的地址空间、文件资源等,开销非常大。

2. 什么是线程(Thread)?

线程是进程内部的“子任务”。 一个进程可以产生多个线程。

  • 比如你的音乐软件(进程),线程 A 负责播歌,线程 B 负责下载,线程 C 负责刷新封面。
  • 特点: 它们都在同一个进程里,共享内存空间

结论:一个进程可以包含多个线程,线程是 CPU 调度的最小执行单位。

灵魂比喻:奶茶店里的“打工人”

为了让大家彻底理解,我们把计算机系统比作一家“奶茶店”

进程 = 这家奶茶店本身。 它拥有店面(内存空间)、冰箱(数据)、配方(代码)和收银系统(文件资源)。

线程 = 店里的店员。

为什么需要多线程?

如果店里只有一个店员(单线程),他得先点单,再去调饮,最后打包,最后扫地。顾客排队能排到街角去!

但如果有多个店员(多线程):

资源共享: 所有店员共用同一个冰箱里的珍珠和椰果(共享堆内存数据),看同一个配方(共享代码),用同一套收银机(共享数据库)。大家在一个店里沟通,成本极低。

私有空间: 虽然资源共享,但每个店员手里都有自己的订单小票(独立栈空间),记得自己正做到哪一步了(程序计数器/寄存器)。大家互不干扰。

伪并行(上下文切换): 如果店里只有一个老板娘(单核 CPU),她会飞快地在店员间巡视:指点一下小 A 调奶茶,马上又去告诉小 B 打包。因为老板娘切换速度极快,在顾客看来,大家就像在同时干活一样。

为什么不直接多开几家分店(多进程)?

开分店意味着你要重新租房、买冰箱、重新申请执照。在计算机中,创建进程需要重新分配内存、复制资源,开销非常巨大。 相比之下,在店里多雇几个店员(创建线程)显然划算得多。

多线程的几个硬核核心点

通过上面的案例和比喻,我们可以总结出多线程的几个硬核核心点:

执行流: 线程是进程内的一个执行流,是 CPU 调度的最小单位。

共享性: 同一个进程内的多个线程,共享地址空间和大部分资源。

独立性: 每个线程拥有自己独立的栈(Stack)和寄存器。

重点避坑:多线程是万能的吗?

虽然多线程很强,但我要提醒大家两点:

  • 数据竞争: 因为大家共用一个冰箱,如果店员 A 和 B 同时伸手去拿最后一份珍珠,可能就会打架。在 Python 里,我们需要用“锁(Lock)”来解决这个问题。
  • 不分国界: 多线程是操作系统的底层机制,不是 Python 特有的。学好了这一节,以后你学 Java、Go 或 C++,逻辑都是通用的。

以上就是“耗时从 13s 降到 3s:手把手教你拆解 Python 多线程的奥秘的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取