Python的并发编程中,多进程和多线程是两种核心的实现方式,二者基于不同的底层逻辑运行,适用场景也有明显区分。多进程通过创建独立的进程来并行执行任务,而多线程则是在同一进程内创建多个线程共享进程资源。

Python中多进程的实现方式
Python标准库中的multiprocessing模块提供了多进程的实现能力,核心是通过Process类创建进程实例,或者通过进程池批量管理进程。
使用Process类创建单个进程
首先需要导入multiprocessing.Process,然后定义要执行的任务函数,将函数和参数传入Process实例,调用start()方法启动进程,最后通过join()方法等待进程执行完成。
import multiprocessing
import time
# 定义进程执行的任务函数
def task(name):
print(f"进程 {name} 开始执行")
time.sleep(2)
print(f"进程 {name} 执行完成")
if __name__ == "__main__":
# 创建进程实例,target为要执行的函数,args为函数参数
p = multiprocessing.Process(target=task, args=("test",))
# 启动进程
p.start()
# 等待进程执行结束
p.join()
print("主进程执行完成")
使用进程池管理多个进程
当需要批量创建多个进程执行同类任务时,可以使用Pool类创建进程池,避免频繁创建和销毁进程带来的资源开销。
import multiprocessing
import time
def calculate(num):
time.sleep(1)
return num * num
if __name__ == "__main__":
# 创建包含4个进程的进程池
pool = multiprocessing.Pool(processes=4)
# 提交任务到进程池,获取结果列表
results = pool.map(calculate, [1, 2, 3, 4, 5])
# 关闭进程池,不再接受新任务
pool.close()
# 等待所有进程执行完成
pool.join()
print(f"计算结果: {results}")
多进程与多线程的核心区别
多进程和多线程的设计理念不同,因此在多个维度上存在明显差异,具体对比如下:
| 对比维度 | 多进程 | 多线程 |
|---|---|---|
| 资源占用 | 每个进程有独立的内存空间,资源占用更高 | 线程共享进程内存空间,资源占用更低 |
| 全局解释器锁影响 | 每个进程有独立的GIL,可充分利用多核CPU | 受GIL限制,同一时刻只有一个线程执行字节码,无法利用多核 |
| 数据安全性 | 进程间数据默认隔离,需要通过队列、管道等方式通信,天然线程安全 | 线程共享进程数据,需要加锁保证线程安全,易出现数据竞争问题 |
| 创建销毁开销 | 创建和销毁进程的开销较大 | 创建和销毁线程的开销较小 |
| 适用场景 | CPU密集型任务,如数据计算、图像处理等 | IO密集型任务,如网络请求、文件读写等 |
进程间通信的常用方式
由于多进程的进程间内存空间相互独立,默认无法直接共享数据,因此需要通过特定的通信方式传递信息,常用的有以下几种:
- Queue队列:先进先出的数据结构,进程可以通过put方法写入数据,get方法读取数据,是进程间通信的常用方式。
- Pipe管道:提供双向通信通道,两个进程分别持有管道的两端,可以进行双向数据传输。
- SharedMemory共享内存:允许多个进程访问同一块内存区域,适合传递大量数据,效率更高。
import multiprocessing
import time
def producer(queue):
for i in range(3):
data = f"数据{i}"
queue.put(data)
print(f"生产者写入: {data}")
time.sleep(1)
# 写入结束标记
queue.put(None)
def consumer(queue):
while True:
data = queue.get()
if data is None:
break
print(f"消费者读取: {data}")
if __name__ == "__main__":
# 创建进程间通信的队列
q = multiprocessing.Queue()
# 创建生产者和消费者进程
p1 = multiprocessing.Process(target=producer, args=(q,))
p2 = multiprocessing.Process(target=consumer, args=(q,))
p1.start()
p2.start()
p1.join()
p2.join()
如何选择多进程和多线程
在实际开发中,可以根据任务类型选择合适的并发方式:
- 如果是CPU密集型任务,任务执行过程中主要消耗CPU资源,优先选择多进程,避免GIL的限制,充分利用多核CPU的性能。
- 如果是IO密集型任务,任务执行过程中大部分时间在等待IO操作完成,优先选择多线程,因为线程创建开销小,且IO等待时线程会释放GIL,不会浪费CPU资源。
- 如果任务既需要大量计算又需要频繁IO,可以结合多进程和多线程,比如用多进程处理计算部分,每个进程内用多线程处理IO部分。
注意:Windows系统下使用multiprocessing模块时,必须将进程创建、启动的代码放在
if __name__ == "__main__":语句块中,否则会出现进程递归创建的问题。
Python多进程多进程与多线程区别Process类线程安全全局解释器锁修改时间:2026-06-16 20:48:35