上一篇
Python进程之并行与并发的区别详解 | Python多任务编程指南
- Python
- 2025-07-27
- 840
Python进程之并行与并发的区别
深入解析Python多任务处理的核心概念与实践应用
并行与并发的本质区别
并行 (Parallelism)
多个任务同时执行,需要多核处理器支持。
- 真正的同时执行
- 适用于CPU密集型任务
- Python中通过多进程实现
- 绕过GIL限制
并发 (Concurrency)
多个任务交替执行,在单核上实现多任务处理。
- 看似同时,实际是快速切换
- 适用于I/O密集型任务
- Python中通过多线程实现
- 受GIL限制
Python多进程实现并行计算
Python的multiprocessing
模块可以创建多个进程,每个进程在独立的CPU核心上运行,实现真正的并行处理。
import multiprocessing
import time
def calculate_square(numbers):
for n in numbers:
time.sleep(0.1) # 模拟计算耗时
print(f"Square: {n * n}")
def calculate_cube(numbers):
for n in numbers:
time.sleep(0.1) # 模拟计算耗时
print(f"Cube: {n * n * n}")
if __name__ == "__main__":
numbers = [2, 3, 4, 5]
# 创建两个进程
p1 = multiprocessing.Process(target=calculate_square, args=(numbers,))
p2 = multiprocessing.Process(target=calculate_cube, args=(numbers,))
# 启动进程
p1.start()
p2.start()
# 等待进程完成
p1.join()
p2.join()
print("两个进程执行完毕!")
多进程的优势:
- 每个进程有独立的Python解释器和内存空间
- 充分利用多核CPU的计算能力
- 避免全局解释器锁(GIL)的限制
- 适合CPU密集型任务(如数学计算、图像处理)
Python多线程实现并发处理
Python的threading
模块用于创建多个线程,这些线程在单个进程中交替执行,实现并发处理。
import threading
import time
def download_file(url):
print(f"开始下载 {url}")
time.sleep(2) # 模拟网络请求耗时
print(f"{url} 下载完成")
def process_file(filename):
print(f"开始处理 {filename}")
time.sleep(1) # 模拟文件处理耗时
print(f"{filename} 处理完成")
if __name__ == "__main__":
urls = ["http://example.com/file1.zip", "http://example.com/file2.pdf"]
filenames = ["data1.csv", "data2.json"]
# 创建线程
download_thread = threading.Thread(target=download_file, args=(urls[0],))
process_thread = threading.Thread(target=process_file, args=(filenames[0],))
# 启动线程
download_thread.start()
process_thread.start()
# 等待线程完成
download_thread.join()
process_thread.join()
print("主线程继续执行其他任务")
多线程的适用场景:
- I/O密集型任务(如网络请求、文件读写)
- 用户界面保持响应
- 需要共享数据结构的场景
- 任务需要频繁等待外部资源
关键概念:全局解释器锁(GIL)
GIL是Python解释器中的一个互斥锁,它防止多个线程同时执行Python字节码。这对并发和并行有重要影响:
GIL对多线程的影响
- 同一时间只有一个线程执行Python字节码
- 无法利用多核CPU实现并行计算
- I/O操作期间会释放GIL
- 适合I/O密集型应用
GIL对多进程的影响
- 每个进程有自己的Python解释器和GIL
- 多个进程可以真正并行执行
- 适合CPU密集型任务
- 进程间通信需要额外机制
如何选择多进程还是多线程?
场景 | 推荐方法 | 原因 |
---|---|---|
CPU密集型任务(计算、数据处理) | 多进程 | 绕过GIL限制,利用多核 |
I/O密集型任务(网络、文件) | 多线程 | I/O等待时释放GIL,切换高效 |
混合型任务 | 多进程+多线程 | 充分利用资源,但增加复杂性 |
本文由LaiKuangXiao于2025-07-27发表在吾爱品聚,如有疑问,请联系我们。
本文链接:https://521pj.cn/20256659.html
发表评论