Python多进程编程是一种利用多个CPU核心并行执行任务的技术,从而提高程序的运行效率。Python提供了multiprocessing
模块,它允许你创建和管理多个进程。下面是一些关于Python多进程编程的基础知识和示例。
基础概念
- 进程(Process):进程是操作系统分配资源的最小单位,每个进程都有自己独立的内存空间和系统资源。
- 线程(Thread):线程是进程中的一个执行单元,多个线程共享进程的内存空间和资源。虽然Python也支持多线程,但由于全局解释器锁(GIL)的存在,多线程在CPU密集型任务上的并行效果有限。
- 多进程:通过创建多个进程来并行执行任务,特别适用于CPU密集型任务。
- 多线程:通过创建多个线程来并发执行任务,适用于IO密集型任务。
multiprocessing
模块
multiprocessing
模块提供了一系列接口来创建和管理进程,以下是常用的几个类和方法:
Process
:表示一个进程对象。Pool
:进程池,可以方便地管理一组进程。Queue
、Pipe
:用于进程间通信。Value
、Array
:用于进程间共享数据。
示例代码
使用Process
类
import multiprocessing
import os
import timedef worker(num):print(f'Worker: {num}, Process ID: {os.getpid()}')time.sleep(2)if __name__ == '__main__':processes = []num_processes = 4for i in range(num_processes):p = multiprocessing.Process(target=worker, args=(i,))processes.append(p)p.start()for p in processes:p.join()print('All processes complete.')
使用Pool
类
import multiprocessing
import timedef worker(num):print(f'Worker: {num}')time.sleep(2)return f'Result: {num}'if __name__ == '__main__':with multiprocessing.Pool(processes=4) as pool:results = pool.map(worker, range(10))print(results)
使用Queue
进行进程间通信
import multiprocessing
import timedef worker(q, num):print(f'Worker: {num}')time.sleep(2)q.put(f'Result from worker {num}')if __name__ == '__main__':q = multiprocessing.Queue()processes = []num_processes = 4for i in range(num_processes):p = multiprocessing.Process(target=worker, args=(q, i))processes.append(p)p.start()for p in processes:p.join()while not q.empty():print(q.get())
注意事项
- 保护入口点:在Windows上,必须保护多进程代码,使其仅在
if __name__ == '__main__':
块中运行,否则会导致无限递归创建进程。 - 进程间通信:使用
Queue
、Pipe
等方式进行进程间通信。 - 数据共享:使用
multiprocessing.Value
、multiprocessing.Array
或multiprocessing.Manager
来共享数据。 - 进程同步:可以使用
multiprocessing.Lock
等同步机制来避免竞争条件。
通过合理使用多进程编程,可以显著提高Python程序的执行效率,尤其是在处理CPU密集型任务时。然而,需要注意的是,多进程编程也带来了进程间通信、数据同步等复杂性,需要根据具体情况权衡利弊。