在Python中,多进程是一种并行执行任务的手段,通过创建多个进程来同时运行多个任务,从而提高程序的执行效率。Python提供了multiprocessing
模块来实现多进程。下面是一些关于Python多进程的基本概念和用法。
基本概念
- 进程(Process):进程是计算机中已经分配资源并能独立运行的一组指令的集合。每个进程都有自己独立的内存空间和系统资源。
- 线程(Thread):线程是进程中的一个执行单元,多个线程共享同一个进程的内存空间和系统资源。线程间的通信和同步相对简单,但受限于全局解释器锁(GIL),Python中的多线程在CPU密集型任务上表现不佳。
- 多进程(Multiprocessing):通过创建多个进程来并行执行任务,从而充分利用多核CPU的计算能力。
multiprocessing
模块
Python的multiprocessing
模块提供了创建和管理进程的接口,类似于标准库中的threading
模块。
1. 创建进程
使用multiprocessing.Process
类来创建一个进程。
python复制代码
from multiprocessing import Process | |
import os | |
def worker(): | |
print(f'Worker process id: {os.getpid()}') | |
if __name__ == '__main__': | |
print(f'Main process id: {os.getpid()}') | |
p = Process(target=worker) | |
p.start() | |
p.join() # 等待进程结束 |
2. 进程间通信
进程间通信(IPC)可以通过多种方式实现,如管道、队列、共享内存等。multiprocessing
模块提供了这些工具。
- 队列(Queue):
python复制代码
from multiprocessing import Process, Queue | |
def worker(q): | |
q.put('Hello from worker') | |
if __name__ == '__main__': | |
q = Queue() | |
p = Process(target=worker, args=(q,)) | |
p.start() | |
p.join() | |
print(q.get()) |
- 管道(Pipe):
python复制代码
from multiprocessing import Process, Pipe | |
def worker(conn): | |
conn.send('Hello from worker') | |
conn.close() | |
if __name__ == '__main__': | |
parent_conn, child_conn = Pipe() | |
p = Process(target=worker, args=(child_conn,)) | |
p.start() | |
print(parent_conn.recv()) | |
p.join() |
3. 进程池(Pool)
进程池允许你并行运行多个进程,而不必手动管理每个进程。multiprocessing.Pool
提供了方便的接口。
python复制代码
from multiprocessing import Pool | |
def worker(num): | |
return num * num | |
if __name__ == '__main__': | |
with Pool(5) as p: # 创建5个进程的池 | |
result = p.map(worker, [1, 2, 3, 4, 5]) | |
print(result) |
注意
- 跨平台差异:在Windows上,多进程的实现依赖于
spawn
或forkserver
,而在Unix/Linux系统上则依赖于fork
。这可能会导致一些行为上的差异。 - 全局解释器锁(GIL):虽然多进程不受GIL限制,但多线程仍然受GIL影响。因此,对于IO密集型任务,多线程可能更有效;而对于CPU密集型任务,多进程是更好的选择。
- 资源消耗:每个进程都有自己独立的内存空间和系统资源,因此多进程会消耗更多的系统资源。
总结
多进程是Python中一种强大的并行执行任务的方法,特别适用于CPU密集型任务。通过multiprocessing
模块,你可以轻松创建和管理多个进程,并实现进程间的通信和同步。然而,使用多进程时也需要注意跨平台差异和资源消耗等问题。