共计 1919 个字符,预计需要花费 5 分钟才能阅读完成。
欢迎来到 Python 基础入门 Day44!今天我们将学习 Python 中的 多线程(threading) 与 多进程(multiprocessing) 编程。它们是实现并发执行、提升程序效率的重要手段,尤其适用于 I/O 密集型和 CPU 密集型任务。
✅ 目录
- 什么是并发与并行
- 多线程:threading 模块
- 多进程:multiprocessing 模块
- 多线程 vs 多进程
- 小结与练习
一、什么是并发与并行?
| 概念 | 说明 |
|---|---|
| 并发(Concurrency) | 在同一个时间段内执行多个任务(宏观同时,微观交替) |
| 并行(Parallelism) | 多个任务真正同时执行(依赖多核 CPU) |
Python 的 GIL(全局解释器锁) 会影响多线程的并行性,因此在 CPU 密集型任务 中推荐使用多进程,在 I/O 密集型任务 中使用多线程效率更高。
二、多线程:threading 模块
2.1 创建线程
import threading
import time
def task(name):
print(f"线程 {name} 开始工作")
time.sleep(2)
print(f"线程 {name} 工作结束")
# 创建线程
t1 = threading.Thread(target=task, args=("A",))
t2 = threading.Thread(target=task, args=("B",))
t1.start()
t2.start()
t1.join()
t2.join()
print("主线程结束")
2.2 使用类封装线程
class MyThread(threading.Thread):
def __init__(self, name):
super().__init__()
self.name = name
def run(self):
print(f"{self.name} 线程运行")
time.sleep(1)
print(f"{self.name} 线程结束")
t = MyThread("自定义线程")
t.start()
t.join()
2.3 多线程锁(threading.Lock)
用于防止线程同时修改共享资源导致的冲突。
lock = threading.Lock()
count = 0
def add():
global count
for _ in range(100000):
with lock:
count += 1
threads = [threading.Thread(target=add) for _ in range(5)]
[t.start() for t in threads]
[t.join() for t in threads] print(“ 最终 count 值:”, count)
三、多进程:multiprocessing 模块
多进程适用于 CPU 密集型任务 ,每个进程拥有独立内存空间。
3.1 创建进程
from multiprocessing import Process
import os
def worker(name):
print(f"{name} 运行中,进程 ID:{os.getpid()}")
p1 = Process(target=worker, args=("进程 1",))
p2 = Process(target=worker, args=("进程 2",))
p1.start()
p2.start()
p1.join()
p2.join()
3.2 使用队列在进程间通信
from multiprocessing import Queue
def producer(q):
for i in range(5):
q.put(i)
print(f"生产:{i}")
def consumer(q):
while not q.empty():
print(f"消费:{q.get()}")
q = Queue()
p1 = Process(target=producer, args=(q,))
p2 = Process(target=consumer, args=(q,))
p1.start()
p1.join()
p2.start()
p2.join()
四、多线程 vs 多进程
| 特性 | 多线程 | 多进程 |
|---|---|---|
| 内存空间 | 共享 | 独立 |
| 创建 / 销毁成本 | 较小 | 较大 |
| GIL 影响 | 受限,不能真正并行计算 | 无 GIL 限制,适合 CPU 密集型任务 |
| 适合任务类型 | I/O 密集型(网络 / 文件读写等) | CPU 密集型(加密、图像处理等) |
五、小结与练习
✅ 今日小结:
- 理解并发与并行的区别。
- 掌握 Python 中多线程的创建、锁机制与线程类封装。
- 学习使用 multiprocessing 实现进程并行、通信。
- 理解线程与进程各自的优势与应用场景。
💡 今日练习:
- 写一个多线程爬虫框架,模拟并发下载网页内容(可使用
requests.get(url))。 - 写一个多进程程序,实现对多个文件的并发压缩或处理。
- 使用线程锁实现一个安全的共享变量计数器。
- 使用进程队列,完成生产者—消费者模型。
正文完