在Python的浩瀚宇宙中,并发编程是攀登性能高峰的必经之路。高手们深知,无论是处理I/O密集型任务还是CPU密集型任务,合理运用线程(threading)与进程(multiprocessing)都能让程序性能实现质的飞跃。今天,就让我们一同揭开这些并发秘籍的面纱,通过实战代码片段,领略线程与进程的终极奥义。
线程:轻量级并发的利器
对于需要频繁进行I/O操作(如网络请求、文件读写)的任务,线程是首选。Python的threading模块提供了简单易用的线程创建与管理接口。
python
import threading
import time
def task(name):
"""模拟一个耗时任务,如网络请求"""
print(f"{name} 开始执行任务")
time.sleep(2) # 模拟耗时操作
print(f"{name} 任务完成")
创建并启动线程
threads = []
for i in range(5):
t = threading.Thread(target=task, args=(f"线程{i+1}",))
threads.append(t)
t.start()
等待所有线程完成
for t in threads:
t.join()
print("所有线程执行完毕")
上述代码展示了如何创建并启动多个线程来并发执行任务。每个线程独立执行task函数,模拟了一个耗时的I/O操作。通过join()方法,我们确保了主线程在所有子线程完成后才继续执行。
进程:多核CPU的终极释放
当面对CPU密集型任务时,如大规模数据处理、复杂计算等,进程则能更充分地利用多核CPU的计算能力。Python的multiprocessing模块提供了与threading类似的API,但它是基于进程的并发模型。
python
from multiprocessing import Process
import os
def cpu_intensive_task(name):
"""模拟一个CPU密集型任务"""
pid = os.getpid()
print(f"{name} (PID {pid}) 开始执行任务")
# 假设这里有大量的计算
for _ in range(10000000):
pass
print(f"{name} (PID {pid}) 任务完成")
创建并启动进程
processes = []
for i in range(4): # 假设我们有4个CPU核心
p = Process(target=cpu_intensive_task, args=(f"进程{i+1}",))
processes.append(p)
p.start()
等待所有进程完成
for p in processes:
p.join()
print("所有进程执行完毕")
在这个例子中,我们创建了四个进程来并发执行CPU密集型任务。每个进程都独立运行在一个新的进程ID(PID)下,确保了计算任务能够充分利用多核CPU的并行处理能力。
终极奥义:结合使用线程与进程
在实际应用中,往往需要根据任务特性灵活选择并发模型。对于混合类型的任务,甚至可以结合使用线程与进程,以达到最优的并发效果。例如,可以使用进程来处理CPU密集型任务,而在每个进程内部,再使用线程来并发处理I/O密集型任务。
通过上述的实战代码片段,我们见证了线程与进程在Python并发编程中的强大力量。掌握这些并发秘籍,你将能够轻松解锁程序性能的无限潜能,让性能飙升不再是梦!