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

Python并发编程入门指南(从多线程到异步编程的完整教程)

在当今高性能计算和网络应用开发中,Python并发编程已成为提升程序效率的关键技术。无论你是刚接触编程的新手,还是希望深入理解并发模型的开发者,本教程都将带你从零开始掌握多线程多进程以及异步编程等核心概念。

Python并发编程入门指南(从多线程到异步编程的完整教程) Python并发编程 多线程 多进程 异步编程 第1张

什么是并发编程?

并发编程是指程序能够同时处理多个任务的能力。注意,并发不等于并行——并发是“看起来同时进行”,而并行是“真正同时执行”。Python 提供了多种实现并发的方式,主要包括:

  • 多线程(Threading)
  • 多进程(Multiprocessing)
  • 异步编程(Asyncio)

1. 多线程(Threading)

Python 的 threading 模块允许你创建多个线程。但由于全局解释器锁(GIL)的存在,多线程在 CPU 密集型任务中并不能真正并行,但在 I/O 密集型任务(如文件读写、网络请求)中非常有效。

import threadingimport timedef task(name):    print(f"线程 {name} 开始")    time.sleep(2)    print(f"线程 {name} 结束")# 创建两个线程thread1 = threading.Thread(target=task, args=("A",))thread2 = threading.Thread(target=task, args=("B",))# 启动线程thread1.start()thread2.start()# 等待线程完成thread1.join()thread2.join()print("所有线程已完成")

2. 多进程(Multiprocessing)

为绕过 GIL 限制,Python 提供了 multiprocessing 模块。每个进程拥有独立的内存空间,适合 CPU 密集型任务。

import multiprocessingimport timedef cpu_task(n):    total = 0    for i in range(n):        total += i * i    return totalif __name__ == "__main__":    start = time.time()        # 创建进程池    with multiprocessing.Pool(processes=2) as pool:        results = pool.map(cpu_task, [1000000, 1000000])        end = time.time()    print(f"结果: {results}")    print(f"耗时: {end - start:.2f} 秒")

3. 异步编程(Asyncio)

对于高并发 I/O 操作(如 Web 请求、数据库查询),asyncio 是更高效的选择。它使用单线程事件循环,通过协程(coroutine)实现非阻塞操作。

import asyncioasync def fetch_data(delay, name):    print(f"开始获取 {name} 的数据...")    await asyncio.sleep(delay)  # 模拟网络延迟    print(f"{name} 的数据已获取")    return f"Data from {name}"async def main():    # 并发执行多个异步任务    tasks = [        fetch_data(2, "API-1"),        fetch_data(1, "API-2"),        fetch_data(3, "API-3")    ]    results = await asyncio.gather(*tasks)    print("所有数据获取完成:", results)# 运行异步主函数asyncio.run(main())

如何选择合适的并发模型?

场景 推荐方式
I/O 密集型(如网络请求、文件读写) 多线程 或 异步编程
CPU 密集型(如数学计算、图像处理) 多进程
高并发 Web 服务 异步编程(如 FastAPI + asyncio)

总结

掌握 Python并发编程 是提升程序性能的重要一步。通过合理使用 多线程多进程异步编程,你可以显著优化应用的响应速度和资源利用率。初学者建议从简单的多线程示例入手,逐步过渡到更复杂的异步模型。

记住:没有“最好”的并发模型,只有“最适合”当前任务的模型。多实践、多测试,才能写出高效可靠的并发程序!