1. 多进程概述
多进程是一种并发编程方式,允许程序同时运行多个进程,每个进程拥有独立的内存空间和系统资源。Python 通过 multiprocessing
模块提供了对多进程编程的支持,适用于 CPU 密集型任务。
2. 创建进程
2.1 使用 Process
类
import multiprocessing
import os
def worker():
print(f"子进程 ID: {os.getpid()}")
if __name__ == "__main__":
p = multiprocessing.Process(target=worker)
p.start()
p.join()
print(f"主进程 ID: {os.getpid()}")
2.2 带参数的进程
def worker(name):
print(f"{name} 在子进程中运行")
if __name__ == "__main__":
p = multiprocessing.Process(target=worker, args=("进程1",))
p.start()
p.join()
3. 进程池
使用 Pool
可以管理多个进程,适用于批量任务处理。
def square(x):
return x * x
if __name__ == "__main__":
with multiprocessing.Pool(processes=4) as pool:
results = pool.map(square, [1, 2, 3, 4, 5])
print(results) # 输出: [1, 4, 9, 16, 25]
4. 进程间通信
4.1 使用队列(Queue)
def producer(q):
q.put("数据")
def consumer(q):
data = q.get()
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()
4.2 使用管道(Pipe)
def sender(conn):
conn.send("消息")
conn.close()
def receiver(conn):
msg = conn.recv()
print(f"收到: {msg}")
conn.close()
if __name__ == "__main__":
parent_conn, child_conn = multiprocessing.Pipe()
p1 = multiprocessing.Process(target=sender, args=(child_conn,))
p2 = multiprocessing.Process(target=receiver, args=(parent_conn,))
p1.start()
p2.start()
p1.join()
p2.join()
5. 进程同步
5.1 使用锁(Lock)
def increment(lock, counter):
with lock:
counter.value += 1
if __name__ == "__main__":
lock = multiprocessing.Lock()
counter = multiprocessing.Value('i', 0)
processes = []
for _ in range(10):
p = multiprocessing.Process(target=increment, args=(lock, counter))
processes.append(p)
p.start()
for p in processes:
p.join()
print(f"最终计数: {counter.value}")
6. 共享内存
使用 Value
和 Array
实现进程间共享数据。
def update_shared_value(shared_val):
shared_val.value += 1
if __name__ == "__main__":
shared_val = multiprocessing.Value('i', 0)
processes = []
for _ in range(5):
p = multiprocessing.Process(target=update_shared_value, args=(shared_val,))
processes.append(p)
p.start()
for p in processes:
p.join()
print(f"共享值结果: {shared_val.value}")
7. 注意事项
在 Windows 系统中,多进程代码必须放在
if __name__ == "__main__":
条件下执行。多进程适用于 CPU 密集型任务,但对于 I/O 密集型任务,多线程可能更合适。
进程间通信会带来额外开销,需谨慎设计。
总结:通过掌握这些多进程编程技术,您可以充分利用多核 CPU 的计算能力,提高程序的执行效率。