Python并发编程,多线程、多进程、协程应用大全! Python是一种解释性的、面向对象的、动态数据类型的高级程序设计语言。Python在Web开发、机器学习、数据分析、游戏开发等领域都得到广泛应用。由于Python的简单易学、灵活和高效的特性,使得Python程序员越来越多。Python的并发编程是Python程序员必须掌握的技能之一。本文将介绍Python的并发编程的知识点,包括多线程、多进程和协程的应用大全。 一、多线程 Python的多线程模块(threading)在多核CPU上并不能发挥出很好的效果。原因在于Python的解释器有一个全局解释器锁(GIL),它使得任何时候只有一个线程在执行。虽然多线程并不能发挥多核CPU的性能,但是对于I/O密集型任务和网络编程来说,多线程仍然是非常实用的。 1. 创建线程 创建线程可以使用threading模块中的Thread类。代码如下: ```python import threading import time def worker(): print("Worker started") time.sleep(2) print("Worker finished") t = threading.Thread(target=worker) t.start() ``` 2. 线程同步 多线程中可能会出现线程竞争的问题,比如多个线程同时对同一个变量进行写操作。为了避免这种情况,需要使用线程同步机制。Python提供了Lock、RLock、Semaphore、BoundedSemaphore、Condition、Event、Barrier等同步机制。下面以Lock为例,展示线程同步的用法。代码如下: ```python import threading total = 0 lock = threading.Lock() def update_total(amount): global total with lock: total += amount thread1 = threading.Thread(target=update_total, args=(10,)) thread2 = threading.Thread(target=update_total, args=(20,)) thread1.start() thread2.start() thread1.join() thread2.join() print(total) ``` 3. 线程池 使用线程池可以灵活控制线程的数量,从而避免线程过多导致系统资源耗尽的问题。Python提供了ThreadPoolExecutor和ProcessPoolExecutor两种线程池。ThreadPoolExecutor用于CPU密集型任务,而ProcessPoolExecutor用于I/O密集型任务。 下面以ThreadPoolExecutor为例,展示线程池的用法。代码如下: ```python from concurrent.futures import ThreadPoolExecutor import time def worker(num): print(f"Worker {num} started") time.sleep(2) print(f"Worker {num} finished") with ThreadPoolExecutor(max_workers=3) as executor: for i in range(5): executor.submit(worker, i) ``` 二、多进程 Python的多进程模块(multiprocessing)可以发挥多核CPU的性能。在多进程中,每个进程有自己独立的内存空间,因此不会出现线程竞争的问题。在Python中,使用多进程编写程序非常简单。 1. 创建进程 创建进程可以使用multiprocessing模块中的Process类。代码如下: ```python import multiprocessing import time def worker(): print("Worker started") time.sleep(2) print("Worker finished") if __name__ == '__main__': p = multiprocessing.Process(target=worker) p.start() p.join() ``` 2. 进程池 使用进程池可以灵活控制进程的数量,从而避免进程过多导致系统资源耗尽的问题。Python提供了Pool类来创建进程池。 下面以Pool为例,展示进程池的用法。代码如下: ```python import multiprocessing import time def worker(num): print(f"Worker {num} started") time.sleep(2) print(f"Worker {num} finished") if __name__ == '__main__': with multiprocessing.Pool(processes=3) as pool: pool.map(worker, range(5)) ``` 三、协程 Python的协程(coroutine)是一种高效的并发编程方式。协程是一种用户空间的轻量级线程,可以在单线程中实现并发。协程避免了线程的上下文切换和线程锁的消耗,因此可以大大提高程序的执行效率。Python中的协程模块是asyncio。 1. 示例代码 下面以一个简单的协程示例来介绍协程的用法。代码如下: ```python import asyncio async def worker(num): print(f"Worker {num} started") await asyncio.sleep(2) print(f"Worker {num} finished") async def main(): await asyncio.gather(worker(1), worker(2), worker(3)) if __name__ == '__main__': asyncio.run(main()) ``` 2. 协程同步 协程同步可以使用asyncio提供的锁和信号量。 下面以锁为例,展示协程同步的用法。代码如下: ```python import asyncio total = 0 lock = asyncio.Lock() async def update_total(amount): global total async with lock: total += amount async def main(): await asyncio.gather(update_total(10), update_total(20)) print(total) if __name__ == '__main__': asyncio.run(main()) ``` 四、总结 本文介绍了Python并发编程的三种方式:多线程、多进程和协程。多线程适用于I/O密集型任务和网络编程;多进程适用于CPU密集型任务;协程适用于I/O密集型任务。掌握并发编程技术可以提高程序的执行效率,是Python程序员必须掌握的技能之一。