张芷铭的个人博客

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