multiprocessing 是 Python 标准库的多进程模块,绕过 GIL 限制实现真正的并行计算。
官方文档:https://docs.python.org/3/library/multiprocessing.html
核心概念
- 进程:独立运行环境,拥有独立内存空间
- GIL:全局解释器锁,同一时刻只允许一个线程执行字节码
- multiprocessing:使用进程替代线程,实现真正并行
基本用法
创建进程
1
2
3
4
5
6
7
8
9
10
11
12
13
| import multiprocessing
def worker(name):
print(f"Worker {name} running")
if __name__ == "__main__":
p1 = multiprocessing.Process(target=worker, args=("A",))
p2 = multiprocessing.Process(target=worker, args=("B",))
p1.start()
p2.start()
p1.join()
p2.join()
|
进程池
1
2
3
4
5
6
7
8
9
| from multiprocessing import Pool
def square(x):
return x * x
if __name__ == "__main__":
with Pool(4) as p:
results = p.map(square, [1, 2, 3, 4, 5])
print(results) # [1, 4, 9, 16, 25]
|
进程间通信
1
2
3
4
5
6
7
8
| # 队列
queue = multiprocessing.Queue()
queue.put(item)
item = queue.get()
# 共享内存
counter = multiprocessing.Value('i', 0) # 整数
arr = multiprocessing.Array('i', [1, 2, 3]) # 数组
|
共享内存示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| def increment(counter):
for _ in range(1000):
counter.value += 1
if __name__ == "__main__":
counter = multiprocessing.Value('i', 0)
processes = [multiprocessing.Process(target=increment, args=(counter,)) for _ in range(4)]
for p in processes:
p.start()
for p in processes:
p.join()
print(f"Counter: {counter.value}")
|
注意事项
- Windows 下必须使用
if __name__ == "__main__": 保护入口 - 进程间共享数据需要使用 Queue、Value、Array
- 进程创建开销比线程大,适合 CPU 密集型任务
Comments