当前位置:首页 > Python > 正文

Python进程之并行与并发的区别详解 | Python多任务编程指南

Python进程之并行与并发的区别

深入解析Python多任务处理的核心概念与实践应用

并行与并发的本质区别

并行 (Parallelism)

多个任务同时执行,需要多核处理器支持。

  • 真正的同时执行
  • 适用于CPU密集型任务
  • Python中通过多进程实现
  • 绕过GIL限制

并发 (Concurrency)

多个任务交替执行,在单核上实现多任务处理。

  • 看似同时,实际是快速切换
  • 适用于I/O密集型任务
  • Python中通过多线程实现
  • 受GIL限制
Python进程之并行与并发的区别详解 | Python多任务编程指南 Python  并行 并发 多进程 多线程 GIL 多任务处理 2025 第1张

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,切换高效
混合型任务 多进程+多线程 充分利用资源,但增加复杂性

发表评论