多进程是指同时运行多个独立的进程,每个进程都可以独立执行特定的任务。在Python中,多进程可以使用multiprocessing包实现。multiprocessing包是Python标准库中的一个模块,提供了多进程编程的工具和接口。本文将从多个角度介绍multiprocessing包的使用。
1. 多进程的优点

多进程主要有以下优点:
- 充分利用多核CPU,提高程序运行效率;
- 可以避免单个程序崩溃导致整个系统崩溃的问题;
- 可以提高程序的可靠性和稳定性,避免资源竞争的问题。
2. multiprocessing包的常用类和函数
multiprocessing包提供了一些常用的类和函数,包括:
- Process类:用于创建进程;
- Queue类:用于进程之间的数据传递;
- Pool类:用于创建进程池;
- Manager类:用于管理进程之间的共享状态。
3. 使用Process类创建进程
使用Process类可以创建新的进程,例如:
```python
import multiprocessing
def worker():
print('Worker')
if __name__ == '__main__':
p = multiprocessing.Process(target=worker)
p.start()
```
这段代码创建了一个新的进程,执行worker函数。在创建进程前,需要注意判断代码是否在主程序中运行,这是为了避免在子进程中重复运行主程序的代码。
4. 使用Queue类传递数据
在多进程编程中,进程之间需要进行数据传递。Queue类提供了一个简单的接口,可以用于进程之间的数据传递,例如:
```python
import multiprocessing
def worker(q):
data = q.get()
print('Worker got:', data)
if __name__ == '__main__':
q = multiprocessing.Queue()
p = multiprocessing.Process(target=worker, args=(q,))
p.start()
q.put('Hello')
p.join()
```
这段代码创建了一个Queue对象,用于传递数据。在创建进程时,将Queue对象作为参数传递给进程函数。在主进程中,使用put方法向队列中添加数据,子进程使用get方法获取数据。
5. 使用Pool类创建进程池
在需要创建多个进程的场景中,可以使用Pool类创建进程池,例如:
```python
import multiprocessing
def worker(num):
return num * num
if __name__ == '__main__':
nums = [1, 2, 3, 4, 5]
with multiprocessing.Pool(2) as p:
results = p.map(worker, nums)
print(results)
```
这段代码创建了一个包含2个进程的进程池,使用map方法将nums列表中的数据传递给进程池,进程池中的进程执行worker函数,返回结果保存在results列表中。
6. 使用Manager类管理共享状态
在多进程编程中,进程之间需要共享一些状态,例如共享内存、共享变量等。使用Manager类可以管理进程之间的共享状态,例如:
```python
import multiprocessing
def worker(d):
d['count'] += 1
if __name__ == '__main__':
with multiprocessing.Manager() as manager:
d = manager.dict()
d['count'] = 0
p1 = multiprocessing.Process(target=worker, args=(d,))
p2 = multiprocessing.Process(target=worker, args=(d,))
p1.start()
p2.start()
p1.join()
p2.join()
print(d['count'])
```
这段代码使用Manager类创建了一个字典对象,用于共享状态。在创建进程时,将字典对象作为参数传递给进程函数。进程函数通过修改字典对象来实现共享状态。
7. 总结
使用multiprocessing包可以方便地实现多进程编程,充分利用多核CPU,提高程序的运行效率。本文介绍了multiprocessing包的常用类和函数,包括Process类、Queue类、Pool类和Manager类。同时,还介绍了使用这些类和函数的示例代码。