python 多进程

在实际的开发过程中,为了提高程序的运行效率,可以使用多进程来同时执行多个任务。Python 提供了 multiprocessing 模块,使得创建和控制多个进程变得十分容易。
为什么使用多进程
在计算机系统中,进程是资源分配的最小单位,多个进程可以同时运行,各自独立地占有一部分系统资源。与多线程相比,多进程更适合用于 CPU 密集型的任务,因为每个进程都有自己独立的内存空间,不会受到其他进程的影响。
通过使用多进程,可以充分利用多核处理器的优势,提高程序的运行效率。
使用 multiprocessing 模块
在 Python 中,multiprocessing 模块提供了创建和控制多个进程的功能。通过使用该模块,可以轻松地实现多进程并发执行任务。
下面是一个简单的示例,展示如何使用 multiprocessing 模块创建多个进程并同时执行任务:
import multiprocessing
import os
def worker(num):
print(f'Worker {num} is running on process id {os.getpid()}')
if __name__ == '__main__':
processes = []
for i in range(5):
p = multiprocessing.Process(target=worker, args=(i,))
processes.append(p)
p.start()
for p in processes:
p.join()
在上面的示例中,首先导入 multiprocessing 模块,并定义了一个 worker 函数,该函数接受一个参数 num,并打印出当前进程的 ID。
然后在主程序中,创建了 5 个进程,并将它们放入一个列表中,随后分别启动这些进程,并使用 join() 方法等待它们结束。运行该程序,可以看到类似如下的输出:
Worker 0 is running on process id 12345
Worker 1 is running on process id 12346
Worker 2 is running on process id 12347
Worker 3 is running on process id 12348
Worker 4 is running on process id 12349
进程池
在实际的开发中,经常会使用进程池来管理多个进程,并重复利用它们。multiprocessing 模块提供了 Pool 类来实现进程池的功能。
下面是一个示例,展示如何使用进程池创建多个进程并重复执行任务:
import multiprocessing
import os
def worker(num):
print(f'Worker {num} is running on process id {os.getpid()}')
if __name__ == '__main__':
with multiprocessing.Pool(processes=3) as pool:
pool.map(worker, range(5))
在上面的示例中,使用 Pool 类创建了一个拥有 3 个进程的进程池,并利用 map() 方法依次执行 worker 函数。运行该程序,可以看到如下输出:
Worker 0 is running on process id 12345
Worker 1 is running on process id 12346
Worker 2 is running on process id 12347
Worker 3 is running on process id 12345
Worker 4 is running on process id 12346
进程间通信
在多进程并发执行任务的过程中,有时候需要进行进程间的通信。multiprocessing 模块提供了多种方式来实现进程间通信,例如 Queue、Pipe 等。
下面是一个示例,展示如何使用 Queue 实现进程间通信:
import multiprocessing
def producer(queue):
for i in range(5):
queue.put(i)
def consumer(queue):
while True:
item = queue.get()
if item is None:
break
print(f'Consumed item: {item}')
if __name__ == '__main__':
queue = multiprocessing.Queue()
producer_process = multiprocessing.Process(target=producer, args=(queue,))
consumer_process = multiprocessing.Process(target=consumer, args=(queue,))
producer_process.start()
consumer_process.start()
producer_process.join()
# Send a None to the consumer process to indicate it should stop
queue.put(None)
consumer_process.join()
在上面的示例中,首先使用 Queue 创建了一个队列,然后定义了一个生产者进程和一个消费者进程,分别向队列中放入数据和从队列中获取数据。
最后,在主程序中分别启动这两个进程,并使用 put() 方法向队列中发送一个 None,表示要停止消费者进程。
运行该程序,可以看到生产者不断地向队列中放入数据,而消费者则不断地从队列中获取数据并打印出来。
总结
通过使用 multiprocessing 模块,Python 提供了一种方便的方式来创建和控制多个进程,实现并发执行任务。使用多进程可以充分利用多核处理器的优势,提高程序的运行效率。同时,可以利用进程池来管理多个进程,并重复利用它们。进程间通信也变得十分容易,可以通过 Queue、Pipe 等方式来实现进程间的数据传输。在进行多进程开发时,需要注意进程间的数据共享和同步,以避免出现竞争条件和死锁等问题。
极客教程